# 集群

# 可选主从架构方案

主要使用一主一从和一主多从方案

image-20220902091610280

# 部署方案

image-20220902093106778

# 架构方案

image-20220902093430722

# 8.0

# 搭建主库

创建文件 E:\www\sql\rw\master1\conf\my.cnf

/www/sql/rw/master1/conf/my.cnf

[mysqld]
log-bin=mysql-bin #开启二进制日志
server-id=1 #服务id,不可重复
#二进制日志方式
binlog_format=MIXED

binlog-do-db=fms
# 不同步的二进制数据库名,如果不设置可将其注释掉;
binlog-ignore-db=test
binlog-ignore-db=mysql
1
2
3
4
5
6
7
8
9
10
E:\www\sql\rw\master1
# /www/sql/rw/master1
chmod 777 * -R

chmod 644 /www/sql/rw/master1/conf/my.cnf
1
2
3
4
5
$ docker run --name master1 -v E:\www\sql\rw\master1\data:/var/lib/mysql -v E:\www\sql\rw\master1\conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -p 3307:3306 -d mysql:8
# Linux
$ docker run --name master1 -v /www/sql/rw/master1/data:/var/lib/mysql -v /www/sql/rw/master1/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:8

docker run -it --rm mysql:8 --verbose --help
1
2
3
4
5

创建同步账户以及授权

create user 'repuser'@'%' identified by 'repuser';
grant replication slave on *.* to 'repuser'@'%';
flush privileges;
#=====================
create user 'repl'@'%' IDENTIFIED WITH mysql_native_password by 'repl';
grant replication slave on *.* to 'repuser'@'%';
grant replication slave on *.* to 'repl'@'%';   ### identified by 'repl';
flush privileges;

1
2
3
4
5
6
7
8
9
#查看master状态
show master status;
#查看二进制日志相关的配置项
show global variables like 'binlog%';
#查看server相关的配置项
show global variables like 'server%';
1
2
3
4
5
6

# 搭建从库

#创建配置文件 E:\www\sql\rw\slave1\conf\my.cnf
# /www/sql/rw/slave1/conf/my.cnf
[mysqld]
server-id=2 #服务id,不可重复

# 级联同步时需要开启bin-log
# log-bin=mysql-bin
1
2
3
4
5
6
7
E:\www\sql\rw\slave1

/www/sql/rw/slave1
chmod 777 * -R

chmod 644 /www/sql/rw/slave1/conf/my.cnf
1
2
3
4
5
6
docker run --name slave1 -v E:\www\sql\rw\slave1\data:/var/lib/mysql -v E:\www\sql\rw\slave1\conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -p 3308:3306 -d mysql:8
# Linux
docker run --name slave1 -v /www/sql/rw/slave1/data:/var/lib/mysql -v /www/sql/rw/slave1/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -p 3308:3306 -d mysql:8
1
2
3
# 设置master相关信息
CHANGE MASTER TO
master_host='192.168.211.135',
master_user='repl',
master_password='repl',
master_port=3306,
master_log_file='mysql-bin.000003',
master_log_pos=1519;
1
2
3
4
5
6
7
8
启动同步
start slave;

# stop slave;
# reset slave;

查看master状态
show slave status;
1
2
3
4
5
6
7
8
# “Public Key Retrieval is not allowed”的错误 时使用
mysql -urepuser -prepuser -h 192.168.211.135 -P3306 --get-server-public-key 

如果报错
[ERROR] [MY-010584] [Repl] Slave I/O for channel '': error connecting to master 'masttos@10.10.10.1:3306' - retry-time: 60 retries: 10 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. Error_code: MY-002061
一般是因为主从同步用户的密码插件导致的。解决办法两种:
1、到主库去修改主从同步的用户的密码插件:
ALTER USER 'masttos'@'%' IDENTIFIED WITH mysql_native_password BY '1qaz@WSX';
2、在配置主从同步的时候增加 GET_MASTER_PUBLIC_KEY = {0|1} 的选项。
此选项适用于使用GET_MASTER_PUBLIC_KEY身份验证插件进行身份验证的副本。对于使用此插件进行身份验证的帐户连接,除非请求,否则源不会发送公钥,因此必须在客户端请求或指定公钥。如果给出了MASTER_PUBLIC_KEY_PATH并指定了有效的公钥文件,则它优先于GET_MASTER_PUBLIC_KEY。如果您使用的复制用户帐户使用caching_sha2_password插件(MySQL 8.0中的默认插件)进行身份验证,并且您没有使用安全连接,则必须指定此选项或MASTER_PUBLIC_KEY_PATH选项,以向复制副本提供RSA公钥。
如果复制用户的身份验证插件是:caching_sha2_password,则需要指定GET_MASTER_PUBLIC_KEY=1;
 CHANGE REPLICATION SOURCE TO SOURCE_HOST='10.10.10.1',SOURCE_PORT=3306,SOURCE_USER='masttos',SOURCE_PASSWORD='1qaz@WSX',SOURCE_LOG_FILE='mysql-bin.000002',SOURCE_LOG_POS=157,GET_MASTER_PUBLIC_KEY=1;
这里要注意:SOURCE_LOG_FILE和SOURCE_LOG_POS,最好从库里查出来。不然对于已经在主从同步的库来说,可能造成主从同步不一致。
1
2
3
4
5
6
7
8
9
10
11
12
13

# 5.7

# 主库

docker run -v E:\www\sql\rw\master1\data:/var/lib/mysql -v E:\www\sql\rw\master1/conf:/etc/mysql/conf.d -v E:\www\sql\rw\master1\logs:/logs -e MYSQL_ROOT_PASSWORD=root --name master1 -p 3307:3306 -d mysql:5.7
#Linux
docker run --name master1 -it --restart=always -v /www/sql/mysql7/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:5.7
1
2
3

service mysql restart

chmod 644 /etc/mysql/conf.d/my.cnf

确保在主服务器上 skip_networking 选项处于 OFF 关闭状态, 这是默认值
如果是启用的,则从站无法与主站通信,并且复制失败。
mysql> show variables like '%skip_networking%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| skip_networking | OFF   |
+-----------------+-------+
1 row in set (0.01 sec)
1
2
3
4
5
6
7
8
9

创建同步账户以及授权

create user 'repuser'@'%' identified by 'repuser';
grant replication slave on *.* to 'repuser'@'%';
flush privileges;
1
2
3

# 从库

docker run --name slave1 -v E:\www\sql\rw\slave1\data:/var/lib/mysql -v E:\www\sql\rw\slave1\conf:/etc/mysql/conf.d -v E:\www\sql\rw\slave1\logs:/logs -e MYSQL_ROOT_PASSWORD=root -p 3308:3306 -d mysql:5.7
1
service mysql restart

#当未读取到服务id时可重启查看日志是否使用到了配置文件

chmod 644 /etc/mysql/conf.d/my.cnf
1
2
3
4
5

use mysql; #删除 drop table slave_master_info; drop table slave_relay_log_info; drop table slave_worker_info; drop table innodb_index_stats; drop table innodb_table_stats; #重建 source /usr/share/mysql/mysql_system_tables.sql

# 配置连接到主服务器的相关信息
CHANGE MASTER TO
master_host='192.168.43.29',
master_port=3307,
master_user='repuser',
master_password='repuser';
1
2
3
4
5
6

# Atlas

与mysql8.0版本匹配不好,会有问题

https://github.com/Qihoo360/Atlas

https://github.com/Qihoo360/Atlas/wiki/Atlas的安装

 #下载页面
 https://github.com/Qihoo360/Atlas/releases
 wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
# 安装
rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
# 卸载
rpm -e Atlas-2.2.1.el6.x86_64.rpm

Atlas的安装目录是/usr/local/mysql-proxy
cd /usr/local/mysql-proxy
# 配置文件
vi /usr/local/mysql-proxy/conf/test.cnf
# 加密
[root@mysqlserver bin]# /usr/local/mysql-proxy/bin/encrypt root
DAJnl8cVzy8=

#启动atlas 
# {start|stop|restart|status}
/usr/local/mysql-proxy/bin/mysql-proxyd test start

tail -f /usr/local/mysql-proxy/log/test.log
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21