0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

配置MySQL主从复制和读写分离

马哥Linux运维 来源:博客园varlemon 2024-10-23 11:44 次阅读

实验环境

序号 主机名 IP地址 备注
1 mysql-master 192.168.204.201 MySQL主库
2 mysql-slave 192.168.204.202 MySQL从库
3 appserver 192.168.204.111 应用服务器

78a241d8-90b7-11ef-a511-92fbcf53809c.png

安装配置MySQL数据库

1.使用yum安装mysql和mysql-server

yum install -y mariadb mariadb-server

2.启动mysql服务

systemctl start mariadb
systemctl enable mariadb

3.查看启动状态

systemctl status mariadb
netstat -anpt | grep "mysql" --color

78b6a164-90b7-11ef-a511-92fbcf53809c.png

4.允许3306端口通过防火墙

firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload

78d0e2a4-90b7-11ef-a511-92fbcf53809c.png

5.设置MySQL密码

mysql_secure_installation

6.在mysql-master上创建数据库

使用root用户登录MySQL

mysql -uroot -p123456

创建数据库并添加数据

create database db_test;
show databases;
use db_test;

create table if not exists user_info(
    username varchar(16) not null,
    password varchar(32) not null,
    realname varchar(16) default '',
    primary key (username)
)default charset=utf8;
show tables;

insert into user_info(username, password, realname) values
('10001', '123456', '小明'),
('10002', '123456', '小红'),
('10003', '123456', '小王'),
('10004', '123456', '小张'),
('10005', '123456', '小李');

select * from user_info where 1;

78e9d052-90b7-11ef-a511-92fbcf53809c.png

在mysql-master上授权数据库访问权限

GRANT all ON db_test.* TO 'admin'@'%' identified BY '123456';
flush privileges;

在mysql-slave、appserver上登录mysql-master数据库

mysql -h 192.168.204.201 -uroot -p123456

78fa0fb2-90b7-11ef-a511-92fbcf53809c.png

在mysql-master上撤销数据库访问权限

REVOKE all ON db_test.* FROM 'admin'@'%';
flush privileges;

配置master和slave两台mysql服务器的主从复制

1.在master数据库上启用binlog日志,建立从库账号rep

查看binlog日志状态

show variables like 'log_bin';

79125d1a-90b7-11ef-a511-92fbcf53809c.png

更改my.cnf配置文件

cp /usr/share/mysql/my-medium.cnf /etc/my.cnf

792b3858-90b7-11ef-a511-92fbcf53809c.png

重启MySQL,查看binlog日志

systemctl restart mariadb
mysql -uroot -p123456 -e "show variables like 'log_bin';"
mysql -uroot -p123456 -e "show master status;"

79418248-90b7-11ef-a511-92fbcf53809c.png

记住此处File和Position的值

建立从库账号

grant replication slave on *.* to rep@'192.168.204.202' identified by '123456';
show grants for rep@'192.168.204.%';

7960ff88-90b7-11ef-a511-92fbcf53809c.png

2.在master数据库上备份现有数据库

对master数据库锁表

flush tables with read lock;

备份master数据库

mysqldump -uroot -p123456 --all-databases | gzip > /root/database_`date '+%Y-%m-%d'`.sql.gz

将备份文件拷贝至slave

scp database_*.sql.gz root@192.168.204.202:/root

3. 配置slave数据库,在slave上恢复数据库

配置slave数据库server-id,关闭binlog日志

cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
# vim /etc/my.cnf

#log-bin=mysql-bin
#binlog_format=mixed
server-id       = 2

79764d70-90b7-11ef-a511-92fbcf53809c.png

4.重启slave的mysql

重启mysql服务

systemctl restart mariadb

查看log_bin和server_id的值

show variables like 'log_bin';
show variables like 'server_id';

798b6188-90b7-11ef-a511-92fbcf53809c.png

5.将数据恢复至slave

gzip -d /root/database_*.sql.gz
mysql -uroot -p123456 < /root/database_*.sql
mysql -uroot -p123456 -e "show databases;"

79a1ccfc-90b7-11ef-a511-92fbcf53809c.png

6.在slave数据库上配置复制参数

在slave上配置复制参数
将MASTER_LOG_FILE和MASTER_LOG_POS的值替换成上述master上查询的值

change master to
MASTER_HOST='192.168.204.201',
MASTER_USER='rep',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=245;

79c29f72-90b7-11ef-a511-92fbcf53809c.png

在slave上配置启用复制

start slave;

79da9a8c-90b7-11ef-a511-92fbcf53809c.png

在slave上查看复制状态

show slave status G;

79fe27cc-90b7-11ef-a511-92fbcf53809c.png

两个均为Yes即可

重启master和slave的mysql服务

systemctl restart mariadb

在master上为数据库db_test增加记录,在slave查看同步情况

-- mysql-master
insert into db_test.user_info (username, password, realname) values ('20001', '123456', 'Tom');
select * from db_test.user_info where 1;

7a1388e2-90b7-11ef-a511-92fbcf53809c.png

-- mysql-slave
select * from db_test.user_info where 1;

7a31212c-90b7-11ef-a511-92fbcf53809c.png

已经实现了主从复制

在appserver上配置mysql读写分离

1.在appserver上安装mysql-proxy

从https://downloads.mysql.com/archives/proxy/下载mysql-proxy

cd ~
wget https://downloads.mysql.com/archives/get/file/mysql-proxy-0.8.5-linux-sles11-x86-64bit.tar.gz
tar -xzvf mysql-proxy-0.8.5-linux-sles11-x86-64bit.tar.gz
cp -r mysql-proxy-0.8.5-linux-sles11-x86-64bit /usr/local/mysql-proxy

2.在appserver上配置mysql-proxy

创建主配置文件

cd /usr/local/mysql-proxy
mkdir lua        #创建脚本存放目录
mkdir logs       #创建日志目录
cp share/doc/mysql-proxy/rw-splitting.lua ./lua/  #复制读写分离配置文件
cp share/doc/mysql-proxy/admin-sql.lua ./lua/     #复制管理脚本
vim /etc/mysql-proxy.cnf     #创建配置文件

主配置文件内容

使用前,请去掉注释

#vim /etc/mysql-proxy.cnf

[mysql-proxy]
user=root #运行mysql-proxy用户
admin-username=myproxy #主从mysql共有的用户
admin-password=123456 #用户的密码
proxy-address=127.0.0.1:3306 #mysql-proxy运行ip和端口,不加端口默认4040
proxy-read-only-backend-addresses=192.168.204.202 #指定后端从slave读取数据
proxy-backend-addresses=192.168.204.201 #指定后端master写入数据
proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua #指定读写分离配置文件位置
admin-lua-script=/usr/local/mysql-proxy/lua/admin-sql/lua #指定管理脚本
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log #日志位置
log-level=info #定义log日志级别,由高到低分别(error|warning|info|message|debug)

修改权限

chmod 660 /etc/mysql-proxy.cnf

3.在appserver上修改读写分离配置文件

vim /usr/local/mysql-proxy/lua/rw-splitting.lua

修改以下内容

--- config
--
-- connection pool
if not proxy.global.config.rwsplit then
        proxy.global.config.rwsplit = {
                min_idle_connections = 1,  -- 默认超过4个连接数时才开始读写分离
                max_idle_connections = 1,  -- 默认为8

                is_debug = false
        }
end

7a613826-90b7-11ef-a511-92fbcf53809c.png

4.在appserver上启动mysql-proxy

启动

/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf --daemon

查看进程

netstat -anpt | grep 3306

7a77ad72-90b7-11ef-a511-92fbcf53809c.png

5.在mysql-master和mysql-slave上分别给myproxy授权

在mysql-master和mysql-slave上授权给mysql-proxy

grant all on *.* to 'myproxy'@'192.168.204.%' identified by '123456';
flush privileges;

6.在appserver上连接mysql-proxy,测试读写分离

在appserver上通过mysql-proxy操作数据库

mysql -h 127.0.0.1 -umyproxy -p123456 -e "select * from db_test.user_info where 1;"
mysql -h 127.0.0.1 -umyproxy -p123456 -e "insert into db_test.user_info (username, password, realname) values ('30001', '123456', 'Jack');"
mysql -h 127.0.0.1 -umyproxy -p123456 -e "select * from db_test.user_info where 1;"

7a8d337c-90b7-11ef-a511-92fbcf53809c.png

在mysql-master上查询

mysql -uroot -p123456 -e "select * from db_test.user_info where 1;"

7ab42478-90b7-11ef-a511-92fbcf53809c.png

在mysql-master上查询

mysql -uroot -p123456 -e "select * from db_test.user_info where 1;"

7ad663b2-90b7-11ef-a511-92fbcf53809c.png

经验证,已实现读写分离

链接:https://www.cnblogs.com/connect/p/mysql-master-slave-copy-and-read-write-separation.html

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    12

    文章

    9046

    浏览量

    85238
  • 数据库
    +关注

    关注

    7

    文章

    3770

    浏览量

    64301
  • MySQL
    +关注

    关注

    1

    文章

    802

    浏览量

    26466

原文标题:配置MySQL主从复制和读写分离

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    MySQL的几种复制配置

    MySQL主从复制、主主复制、双主多从配置
    发表于 04-16 09:50

    基于二进制安装MySQL主从复制

    二进制安装MySQL实现主从复制
    发表于 03-10 09:43

    mysql主从复制

    mysql 主从复制
    发表于 04-28 14:30

    基于mycat的Mysql主从复制读写分离全攻略

    基于mycat的Mysql主从复制读写分离全攻略
    发表于 09-08 10:10 4次下载
    基于mycat的<b class='flag-5'>Mysql</b><b class='flag-5'>主从复制</b><b class='flag-5'>读写</b><b class='flag-5'>分离</b>全攻略

    mysql数据库同步原理

    MySQL主从复制原理 为了减轻主库的压力,应该在系统应用层面做读写分离,写操作走主库,读操作走从库,下图为MySQL官网给出的
    发表于 09-28 11:49 0次下载
    <b class='flag-5'>mysql</b>数据库同步原理

    利用MySQL进行一主一从的主从复制

    本文讲述了如何使用MyBatisPlus+ShardingSphereJDBC进行读写分离,以及利用MySQL进行一主一从的主从复制
    的头像 发表于 07-28 09:47 1015次阅读

    MySQL主从复制原理详解

    简单讲,MySQL主从复制就是数据写入一台服务器(主服务器)后,同时还会额外写入另外的服务器(从服务器)。也就是说数据会写多份,这样做的目的主要有两个:
    的头像 发表于 02-06 10:27 1071次阅读

    一个操作把MySQL主从复制整崩了

    最近公司某项目上反馈mysql主从复制失败,被运维部门记了一次大过,影响到了项目的验收推进,那么究竟是什么原因导致的呢?而主从复制的原理又是什么呢?本文就对排查分析的过程做一个记录。
    的头像 发表于 05-11 11:14 529次阅读
    一个操作把<b class='flag-5'>MySQL</b><b class='flag-5'>主从复制</b>整崩了

    什么是Redis主从复制

    Redis主从复制 来自灵魂的拷问:什么是Redis主从复制? 简言之就是: 主对外从对内,主可写从不可写 主挂了,从不可为主 看下面的图加深下理解: 对,你没看错,Redis主从复制没有动态选举
    的头像 发表于 10-09 15:09 404次阅读
    什么是Redis<b class='flag-5'>主从复制</b>

    mysql主从复制三种模式

    MySQL主从复制是一种常见的数据同步方式,它可以实现将一个数据库的更改同步到其他多个数据库的功能。主从复制可以提高数据库的可用性和性能,以及提供故障恢复和数据备份的支持。在MySQL
    的头像 发表于 11-16 14:04 1459次阅读

    mysql如何实现主从复制的具体流程

    主从复制MySQL数据库中常用的数据复制技术之一,它的主要目的是将一个数据库服务器上的数据复制到其他服务器上,以实现数据的备份、高可用和分布式部署。下面将详细介绍
    的头像 发表于 11-16 14:10 751次阅读

    mysql主从复制主要有几种模式

    MySQL主从复制MySQL数据库中常用的一种数据复制方式,用于实现数据的备份、负载均衡、故障恢复等目的。主从复制主要有以下几种模式: 异
    的头像 发表于 11-16 14:15 1145次阅读

    mysql主从复制的原理

    MySQL主从复制是一种数据库复制技术,它允许将一个MySQL数据库的更新操作自动复制到其他MySQL
    的头像 发表于 11-16 14:18 468次阅读

    mysql主从复制 混合类型的复制

    使用行级复制和语句级复制。本文将详细介绍MySQL主从复制的概念、原理、配置步骤以及优缺点,并重点讨论混合类型
    的头像 发表于 11-16 14:20 538次阅读

    mysql主从复制数据不一致怎么办

    MySQL主从复制是一种常用的数据复制技术,用于实现数据的实时同步和分布式部署。然而,在实际应用中,主从复制过程中出现数据不一致的情况也是很常见的。本文将从以下几个方面介绍
    的头像 发表于 11-16 14:35 2331次阅读