本文講解mysql的集羣搭建
1. docker安裝並啓動三臺mysql
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD="123456" \
--privileged=true -v /c/Users/Public/conf/my.cnf:/etc/mysql/my.cnf \
--name=mysql1 mysql:5.6.17
參數說明:
-d 後臺運行容器並打印容器id
-p 指定端口映射 主機:容器
-e 設置環境變量
–privileged 是否容器有足夠的權限(root)
-v 指定目錄映射
–name 指定容器名稱
docker exec -it mysql1 /bin/bash
第二臺
docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD="123456" \
--privileged=true -v /c/Users/Public/conf/my.cnf:/etc/mysql/my2.cnf \
--name=mysql1 mysql:5.6.17
第三臺
docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD="123456" \
--privileged=true -v /c/Users/Public/conf/my.cnf:/etc/mysql/my3.cnf \
--name=mysql1 mysql:5.6.17
2. 創建基礎庫並設置可訪問用戶
分別在三臺mysql上建立test數據庫
create database test character set utf8 collate utf8_general_ci;
設置mysql用戶及權限
grant all privileges on test.* to culter@'%' identified by "123321";
flush privileges;
3. 主從配置
主:192.168.0.97:3306
從:192.168.99.100:3307
192.168.99.100:3308
192.168.99.100:3309
3.1 主服務器配置
# 主從複製需要開啓binglog
log-bin=mysql-bin
# 二進制格式推薦 mixed
binlog_format=mixed
# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id = 1
設置複製權限:
grant replication slave on *.* to 'culter'@'%' identified by '123321';
如果指定數據庫 會報錯:
mysql> grant replication slave on test.* to 'culter'@'%' identified by '123321';
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
mysql> grant replication slave on *.* to 'culter'@'%' identified by '123321';
Query OK, 0 rows affected (0.00 sec)
展示主服務器狀態:
show master status;
下面的從庫配置會使用到:
3.2 從服務器配置
step 1 更改配置文件
分別在從服務器中的my.cnf中添加 將id分別改爲 2,3,4
[mysqld]
log-bin=mysql-bin
binlog_format=mixed
server-id = 2
step 2 配置同步主庫源
然後我們對三臺機器分別設置
change master to master_host='192.168.0.97',master_user='culter',master_password='123321',master_log_file='mysql-bin.000003',master_log_pos=204;
完整語法:
CHANGE MASTER TO
MASTER_HOST='192.168.0.97',
MASTER_USER='culter',
MASTER_PASSWORD='123321',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=325,
MASTER_AUTO_POSITION=0;
報錯:
ERROR 1794 (HY000): Slave is not configured or failed to initialize properly. You must at least set --server-id to enable either a master or a slave. Additional error messages can be found in the MySQL error log.
注意:由於我使用的docker安裝的,並指定了my.cnf的映射目錄,導致 /etc/mysql/my.cnf
無論怎樣
更改權限,都無法加載,會報如下錯誤(必須進入mysql對應的容器內部執行命令才能看到)
root@8251dd588c9c:/usr/local/mysql# mysql -uculter -p
Warning: World-writable config file '/etc/mysql/my.cnf' is ignored
這個錯誤的原因是因爲mysql認爲my.cnf
的操作權限是777,任何人都能操作,所以存在安全隱患,就直接忽略了這個配置文件。
但是由於我們無法更改,只能新建一個 /etc/my.cnf
然後重新加入上面的內容,並重啓容器
命令執行順序
docker exec -it mysql1 /bin/bash
vim /etc/my.cnf
內容
[mysqld]
log-bin=mysql-bin
binlog_format=mixed
server-id = 2
重啓
docker restart mysql1
step 3 啓動主從複製
mysql> slave start;
報錯:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'slave start' at line 1
mysql> start slave ;
Query OK, 0 rows affected (0.01 sec)
根據部分mysql版本的原因,可能會出現命令的不一致,需要更改命令爲:
mysql> start slave;
碼字不易,打賞一下小弟吧