mysql主從架構部署和配置
1. mysql常見集羣架構
-
主從架構(Master-Slaves)
在實際應用場景中,mysql集羣90%是按照這種架構模式部署的。
缺點:
- master節點不能停機,停機就不能接收寫請求。
- slave同步數據時會出現延遲。
- 數據同步是單向的,當master停機,提升某個slave成爲master時,就會和之前的master數據不一致。
-
雙主架構(Master-Master)
兩個mysql實例相互同步數據。
-
主從級聯架構(Master-Slaves-Slaves)
解決讀壓力特別大的問題,缺點是slave延遲更加大了。
-
雙主+級聯架構
這樣解決了master單點問題。
2. 部署mysql主從架構
2.1. mysql常用命令
# 下載Mysql源安裝包
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
# yum安裝mysql源
yum localinstall mysql57-community-release-el7-8.noarch.rpm -y
# 檢查mysql源是否安裝成功
yum repolist enabled | grep "mysql.*-community.*"
# yum安裝Mysql
yum install mysql-community-server -y
# 啓動Mysql服務
systemctl start mysqld
# 並添加開機啓動
systemctl enable mysqld systemctl daemon-reload
# 查看Mysql狀態
systemctl status mysqld
# 查看默認的mysql密碼
vi /var/log/mysqld.log
# 修改mysql的密碼
# 登錄mysql,輸入原始密碼: =>g6hj.Nx4e (上面查看的原始密碼)
mysql -uroot -p
# 修改mysql的密碼
set password for 'root'@'localhost'=password('123456');
# 添加遠程登陸的用戶權限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
# 刷新權限
FLUSH PRIVILEGES;
# 接下來一些常用操作
# 修改mysql字符編碼
vi /etc/my.cnf
# 添加
character_set_server=utf8
init_connect='SET NAMES utf8'
# 重啓Mysql
systemctl stop mysqld
systemctl start mysqld
# 查看Mysql字符集
show variables like '%character%'
# 卸載
rpm -qa|grep -i mysql
yum remove mysql-community-server -y
rpm -ev mysql-community-libs-5.7.24-1.el7.x86_64 --nodeps
# 刪除文件
find / -name mysql
rm -rf /var/lib/mysql
rm -rf /etc/my.cnf
2.2. docker安裝mysql
接下來用docker安裝兩個mysql實例,並配置主從架構。
- 使用docker命令安裝兩個mysql實例:
docker run --name mysql3307 -p 3307:3306 --privileged=true -ti -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=yc_test -e MYSQL_USER=yc -e MYSQL_PASSWORD=123456 -v /data/canyang3/docker-data/mysql3307/conf:/etc/mysql/conf.d -v /data/canyang3/docker-data/mysql3307/data/:/var/lib/mysql -v /data/canyang3/docker-data/mysql3307/logs/:/var/log/mysql -d mysql:5.7
docker run --name mysql3308 -p 3308:3306 --privileged=true -ti -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=yc_test -e MYSQL_USER=yc -e MYSQL_PASSWORD=123456 -v /data/canyang3/docker-data/mysql3308/conf:/etc/mysql/conf.d -v /data/canyang3/docker-data/mysql3308/data/:/var/lib/mysql -v /data/canyang3/docker-data/mysql3308/logs/:/var/log/mysql -d mysql:5.7
docker命令解讀:
docker run
--name mysql3307 # 定義鏡像別名
-p 3307:3306 # 映射端口號
--privileged=true # docker鏡像獲取宿主機root權限
-it # 分配一個僞終端
-e MYSQL_ROOT_PASSWORD=123456 # 設置mysql root密碼爲123456
-e MYSQL_DATABASE=yc_test # 創建默認數據庫
-e MYSQL_USER=yc # 添加mysql用戶
-e MYSQL_PASSWORD=123456 # 添加mysql用戶密碼
-v /data/canyang3/docker-data/mysql3307/conf:/etc/mysql/conf.d # 掛載指定目錄到宿主機
-v /data/canyang3/docker-data/mysql3307/data/:/var/lib/mysql
-v /data/canyang3/docker-data/mysql3307/logs/:/var/log/mysql
-d mysql:5.7 # 後臺運行容器並返回容器ID
進入docker鏡像,查看mysql狀態
docker exec -it mysql3307 /bin/bash
service mysql status
2.2. 配置mysql主從關係
-
創建master mysql的配置,重啓鏡像
vim /data/canyang3/docker-data/mysql3307/conf/my.cnf # 添加 [mysqld] port=3306 character_set_server=utf8 init_connect='SET NAMES utf8' default-storage-engine=INNODB symbolic-links=0 lower_case_table_names=1 server-id=10001 log-bin=mysql-bin auto_increment_increment=2 auto_increment_offset=1 plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=10000
-
創建slave mysql的配置,重啓鏡像
vim /data/canyang3/docker-data/mysql3308/conf/my.cnf # 添加 [mysqld] port=3306 character_set_server=utf8 init_connect='SET NAMES utf8' default-storage-engine=INNODB symbolic-links=0 lower_case_table_names=1 server-id=10002 log-bin=mysql-bin auto_increment_increment=2 auto_increment_offset=2 plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=10000
-
在master庫中添加同步數據賬號
GRANT REPLICATION SLAVE,FILE,REPLICATION CLIENT ON *.* TO 'repluser'@'%' IDENTIFIED BY '123456'; FLUSH PRIVILEGES; # 查看二進制日誌 show master status;
-
在slave中設置master信息
change master to master_host='172.31.63.26',master_port=3307,master_user='repluser',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=3111; # 開啓slave,啓動sql和IO線程 start slave; # 查看slave的狀態 show slave status\G