mysql双主双从集群+mycat读写分离

 

 实验:

环境准备
环境:centos7.3、docker
角色
ip
端口
master1
100.98.100.186
3306
master2
100.98.100.186
3307
slave1
100.98.100.186
3308
slave2
100.98.100.186
3309
mycat
100.98.100.186
8066
 
 
1、使用docker启动4个docker节点
mysql双主双从集群配置
mkdir -p /data/mysql{1..4}/{conf,logs,data}
docker run -p 3306:3306 --name master1 -v /data/mysql1/conf:/etc/mysql/conf.d -v /data/mysql1/logs:/logs -v /data/mysql1/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
docker run -p 3307:3306 --name master2 -v /data/mysql2/conf:/etc/mysql/conf.d -v /data/mysql2/logs:/logs -v /data/mysql2/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
docker run -p 3308:3306 --name slave1 -v /data/mysql3/conf:/etc/mysql/conf.d -v /data/mysql3/logs:/logs -v /data/mysql3/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
docker run -p 3309:3306 --name slave2 -v /data/mysql4/conf:/etc/mysql/conf.d -v /data/mysql4/logs:/logs -v /data/mysql4/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
2、配置每个docker的远程密码
docker exec -it master1 /bin/bash
mysql -uroot -p123456
GRANT ALL ON *.* TO 'root'@'%';
flush privileges;
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;
exit
exit

docker exec -it master2 /bin/bash
mysql -uroot -p123456
GRANT ALL ON *.* TO 'root'@'%';
flush privileges;
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;
exit
exit

docker exec -it slave1 /bin/bash
mysql -uroot -p123456
GRANT ALL ON *.* TO 'root'@'%';
flush privileges;
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;
exit
exit

docker exec -it slave2 /bin/bash
mysql -uroot -p123456
GRANT ALL ON *.* TO 'root'@'%';
flush privileges;
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;
exit
exit
集群配置
1、修改master1配置
cat <<EOF > /data/mysql1/conf/my.cnf
[mysqld]
#主服务器唯一id
server-id=1
#启用二进制日志
log-bin=mysql-bin
#设置不用复制的数据库
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=test
#设置logbin格式
binlog_format=STATEMENT
#在作为从数据库的时候,有写入操作也要更新二进制日志文件
#log-slave-updates
log_replica_updates
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围1..65535
auto-increment-increment=2
#表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1..65535
auto-increment-offset=1
EOF
2、修改master2配置
cat <<EOF > /data/mysql2/conf/my.cnf
[mysqld]
#主服务器唯一id 2留给master1的slave
server-id=3
#启用二进制日志
log-bin=mysql-bin
#设置不用复制的数据库
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=test
#设置logbin格式
binlog_format=STATEMENT
#在作为从数据库的时候,有写入操作也要更新二进制日志文件
#log-slave-updates
log_replica_updates
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围1..65535
auto-increment-increment=2
#表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1..65535,这儿应该是2了
auto-increment-offset=2
EOF
3、修改从机slave1
cat <<EOF > /data/mysql3/conf/my.cnf
[mysqld]
server-id=2
relay-log=mysql-relay
EOF
4、修改从机slave2
cat <<EOF > /data/mysql4/conf/my.cnf
[mysqld]
server-id=4
relay-log=mysql-relay
EOF
重启服务
docker ps -a -q|xargs docker restart
创建同步用户、slave配置同步
1、节点1配置主从
查看master1状态
docker exec -it master1 /bin/bash
mysql -uroot -p123456
#创建用户并授权
create user 'slave'@'%' identified by  '123123';
grant REPLICATION SLAVE ON *.* TO 'slave'@'%' with grant option;
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123123';
flush privileges;
mysql> show master status;
+------------------+----------+--------------+--------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB         | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------+-------------------+
| mysql-bin.000011 |      616 | test         | mysql,information_schema |                   |
+------------------+----------+--------------+--------------------------+-------------------+
1 row in set (0.00 sec)
slave1节点加入到master1
docker exec -it slave1 /bin/bash
mysql -uroot -p123456
mysql> CHANGE MASTER TO MASTER_HOST='100.98.100.186',
MASTER_USER='slave',
MASTER_PASSWORD='123123',
MASTER_PORT= 3306,
MASTER_LOG_FILE='mysql-bin.000011',MASTER_LOG_POS=616;
#启动
mysql> start slave;
mysql> show slave status \G;
--如果出问题重新初始化
stop slave;
reset master;
2、节点2配置主从
docker exec -it master2 /bin/bash
mysql -uroot -p123456
#创建用户并授权
create user 'slave'@'%' identified by  '123123';
grant REPLICATION SLAVE ON *.* TO 'slave'@'%' with grant option;
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123123';
flush privileges;
mysql> show master status;
+------------------+----------+--------------+--------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB         | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------+-------------------+
| mysql-bin.000001 |      860 | test         | mysql,information_schema |                   |
+------------------+----------+--------------+--------------------------+-------------------+
1 row in set (0.00 sec)
slave2节点加入到master2
docker exec -it slave2 /bin/bash
mysql -uroot -p123456
mysql> CHANGE MASTER TO MASTER_HOST='100.98.100.186',
MASTER_USER='slave',
MASTER_PASSWORD='123123',
MASTER_PORT= 3307,
MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=860;
#启动
mysql> start slave;
mysql> show slave status \G;
--如果出问题重新初始化
stop slave;
reset master;
3、master1和master2两个都是复制对方
master1 使用master2的binglog,即slave2的同步配置
CHANGE MASTER TO MASTER_HOST='100.98.100.186',
MASTER_USER='slave',
MASTER_PASSWORD='123123',
MASTER_PORT= 3307,
MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=860;
mysql> start slave;
mysql> show slave status \G;
master2 使用master1的binglog,即slave1的同步配置
CHANGE MASTER TO MASTER_HOST='100.98.100.186',
MASTER_USER='slave',
MASTER_PASSWORD='123123',
MASTER_PORT= 3306,
MASTER_LOG_FILE='mysql-bin.000011',MASTER_LOG_POS=616;
#启动
mysql> start slave;
mysql> show slave status \G;
验证集群
建库建表插入数据
create database test 
 DEFAULT CHARACTER SET utf8mb4
 DEFAULT COLLATE utf8mb4_0900_ai_ci;
 use test;
create table student(
      id int,
      name varchar(100)
)
insert into student value(1,'zs');
mycat配置

 

 

[root@node-1 conf]# more schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1" dataNode="dn1">
        </schema>
        <dataNode name="dn1" dataHost="node-1" database="test" />
        <dataHost name="node-1" maxCon="1000" minCon="10" balance="1"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="master1" url="100.98.100.186:3306" user="root"  password="123456">
                   <readHost host="slave1" url="100.98.100.186:3308" user="root" password="123456" />
                </writeHost>
                <writeHost host="master2" url="100.98.100.186:3307" user="root"  password="123456">
                   <readHost host="slave2" url="100.98.100.186:3309" user="root" password="123456" />
                </writeHost>
        </dataHost>
</mycat:schema>
验证读写分离
mysql -uroot -p123456 -h100.98.100.186 -P8066
 mysql> select @@hostname from student;

  

  

posted @ 2021-09-10 11:43  苍茫宇宙  阅读(104)  评论(0编辑  收藏  举报