mysql集群
最近在參加項目開發(fā)微信小程序后臺晌纫,由于用戶數(shù)量巨大荐类,且后臺程序并不是很完美夯辖,所以對用戶的體驗很是不友好(簡單說就是很卡)。趕巧最近正在翻閱《大型網(wǎng)站系統(tǒng)與Java中間件實踐》劝评。
所以姐直,先是使用Docker swarm構(gòu)建了負載均衡集群,然后使用Atlas做了數(shù)據(jù)庫的讀寫分離蒋畜,盡可能對用戶進行分流声畏,降低對單機服務(wù)器的負載,提高訪問體驗。本片隨筆僅對數(shù)據(jù)庫的讀寫分離部分進行介紹插龄。
目標:實現(xiàn)mysql數(shù)據(jù)庫集群愿棋,一個主節(jié)點負責(zé)寫入數(shù)據(jù),多個從節(jié)點負責(zé)讀取數(shù)據(jù)
實驗環(huán)境
服務(wù)器:
阿里云服務(wù)器:centos7(10.0.0.1)
騰訊云服務(wù)器:ubuntu:16.04(10.0.0.2)
京東云服務(wù)器:ubuntu:16.04 (10.0.0.3)
mysql:5.7
docker:18.03
實現(xiàn)方案
mysql 主從數(shù)據(jù)庫 + Atlas讀寫分離
步驟:
進入Master服務(wù)器進行配置
使用Docker均牢,在服務(wù)器上創(chuàng)建MySQL服務(wù)
docker run -p 3306:3306 --name mysql3306 -v /opt/mysql/data/data3306:/var/lib/mysql -v /opt/mysql/logs/logs3306:/logs -e MYSQL_ROOT_PASSWORD=hello -d mysql:5.7
進Master服務(wù)器的MySQL數(shù)據(jù)庫中糠雨,創(chuàng)建用戶"niwoo"設(shè)置密碼為"hello"
mysql -h 127.0.0.1 -uroot -phello
mysql> grant all on . to ninwoo@'127.0.0.1' identified by "hello";
Query OK, 0 rows affected, 1 warning (0.00 sec)
修改niwoo的訪問權(quán)限
mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> update user set host = '%' where user = 'ninwoo';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0
確認是否修改成功
mysql> update user set host = '%' where user = 'ninwoo';
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select user, host from user;
+---------------+-----------+
| user | host |
+---------------+-----------+
| ninwoo | % |
| root | % |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+-----------+
5 rows in set (0.00 sec)
更新數(shù)據(jù)庫,是配置生效
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
Master,Slave1的MySQL數(shù)據(jù)庫上創(chuàng)建CampusHire數(shù)據(jù)庫
進入Slave1執(zhí)行相同1,2,3,4操作
配置主從數(shù)據(jù)庫連接
進入Master服務(wù)器進行配置
進入mysql容器內(nèi)部徘跪,修改配置文件
docker exec -it mysql3306 bash
默認沒有vim见秤,無法修改文件
更新軟件源
apt update
安裝vim
apt install vim
修改mysql配置文件
vim /etc/mysql/mysql.conf.d/mysqld.cnf
添加如下配置
主從復(fù)制配置
innodb_flush_log_at_trx_commit=1
sync_binlog=1
需要備份的數(shù)據(jù)庫
binlog-do-db=test
不需要備份的數(shù)據(jù)庫
binlog-ignore-db=mysql
啟動二進制文件
log-bin=mysql-bin
服務(wù)器ID
server-id=1
退出容器,重啟docker應(yīng)用
docker restart mysql3306
進入數(shù)據(jù)庫真椿,配置主從復(fù)制的權(quán)限
mysql -h 127.0.0.1 -uroot -phello
mysql> grant replication slave on . to 'ninwoo'@'127.0.0.1' identified by 'hello';
Query OK, 0 rows affected, 1 warning (0.01 sec)
鎖定數(shù)據(jù)庫
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
查看主數(shù)據(jù)庫信息鹃答,記住下面的“File”與“Position”的信息
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 439 | CampusHire | mysql | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
進入slave服務(wù)器,進入mysql容器內(nèi)部
更新軟件源
apt update
安裝vim
apt install vim
修改從數(shù)據(jù)庫的配置文件
vim /etc/mysql/mysql.conf.d/mysqld.cnf
添加server-id=2
重啟Slave數(shù)據(jù)庫
docker restart mysql3306
進入數(shù)據(jù)庫突硝,輸入剛剛記錄下來的File和Position
MySQL [(none)]> change master to master_host='10.0.0.1',
->
-> master_user='ninwoo',
-> master_password='hello',
-> master_port=3306,
-> master_log_file='mysql-bin.000001',
-> master_log_pos=439,
-> master_connect_retry=10;
啟動Slave進程
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
查看復(fù)制狀態(tài)
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 139.199.194.49
Master_User: ninwoo
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 439
Relay_Log_File: 2a8a4abdcf68-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 439
Relay_Log_Space: 534
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 4a0187fa-b0a5-11e8-a7e7-0242ac110003
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more up dates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
到這里主從數(shù)據(jù)的配置就已經(jīng)完成测摔,在向主庫寫入數(shù)據(jù)的同時,將在從庫進行自動的備份解恰。但在實際測試中遇到了配置完成之后無法向主數(shù)據(jù)庫寫入的問題锋八,初步
判斷是由于主庫加鎖而未解鎖的問題,所以這里采用比較暴力的方法护盈,重啟主數(shù)據(jù)庫容器挟纱。
master節(jié)點
docker restart mysql3306
配置Atlas
Atlas是有360團隊優(yōu)化mysqlproxy而衍生出的版本,性能更好更穩(wěn)定腐宋。
Atlas有兩個版本紊服,這里我選擇普通版本,即不分表胸竞。
在阿里云主機(centos7)上進行一下安裝步驟:
下載安裝
[root@localhost ~]# cd /home/
[root@localhost home]# wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
安裝
[root@localhost home]# rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
安裝目錄位于/usr/local/mysql-proxy/
使用安裝目錄下的bin/encrypt程序加密數(shù)據(jù)庫密碼
[root@localhost bin]# ./encrypt hello
配置Atlas
[root@localhost conf]# cd /usr/local/mysql-proxy/conf/
[root@localhost conf]# vim test.cnf
修改以下配置:
管理接口的用戶名
admin-username = user
管理接口的密碼
admin-password = pwd
...
Atlas后端連接的MySQL主庫的IP和端口欺嗤,可設(shè)置多項,用逗號分隔
proxy-backend-addresses = 10.0.0.1:3306
Atlas后端連接的MySQL從庫的IP和端口卫枝,@后面的數(shù)字代表權(quán)重煎饼,用來作負載均衡,若省略則默認為1校赤,可設(shè)置多項吆玖,用逗號分隔
proxy-read-only-backend-addresses = 10.0.0.2:3306@1
...
用戶名與其對應(yīng)的加密過的MySQL密碼,密碼使用PREFIX/bin目錄下的加密程序encrypt加密马篮,下行的user1和user2為示例沾乘,將其替換為你的MySQL的用戶名和加密密碼!
pwds = buck:RePBqJ+5gI4=
...
Atlas監(jiān)聽的工作接口IP和端口
proxy-address = 0.0.0.0:1234
Atlas監(jiān)聽的管理接口IP和端口
admin-address = 0.0.0.0:2345
讀者需要根據(jù)自己的實際情況修改以上配置
啟動Atlas
[root@localhost bin]# /etc/init.d/mysqld status
OK: MySQL-Proxy of test is started
使用mysql命令連接數(shù)據(jù)庫
其中2345端口是管理端口积蔚,用戶可以在該管理數(shù)據(jù)庫中修改數(shù)據(jù)庫代理服務(wù)器的相關(guān)配置
[root@localhost bin]# mysql -h127.0.0.1 -P2345 -uuser -ppwd
其中1234端口是數(shù)據(jù)庫代理服務(wù)器的端口意鲸,用戶可以直接訪問該端口進行數(shù)據(jù)庫的訪問和更新
[root@localhost bin]# mysql -h127.0.0.1 -P1234 -ubuck -phello
使用軟件連接Atlas數(shù)據(jù)庫代理服務(wù)器
這里發(fā)現(xiàn),之前使用的mysql workbench無法正常使用尽爆,更換Navicat可以正常使用怎顾。
使用jdbc連接數(shù)據(jù)庫
使用方法與普通數(shù)據(jù)庫一樣。
后記
到這里漱贱,配置就已經(jīng)全部完成槐雾。有心的讀者或者已經(jīng)發(fā)現(xiàn),還有一臺服務(wù)器未使用幅狮,這臺服務(wù)器將在以后接入到現(xiàn)有的mysql數(shù)據(jù)庫集群當(dāng)中募强,充當(dāng)新的slave節(jié)點。該實驗將在以后補上崇摄。
理論上說擎值,我所做的這些或許會對負載過大的問題有所解決。但最近并未出現(xiàn)太高的訪問現(xiàn)象逐抑,所以短期也沒有看到效果鸠儿。具體效果,將在實際場景中驗證后補充上厕氨,敬請期待进每。