配置MySQL的主從複製與讀寫分離。MySQL主庫負責數據寫入和數據修改的操作,MySQL從庫負責資料庫讀取任務的操作。在此基礎上通過配置mysql-proxy進行MySQL資料庫的讀寫分離,將讀資料庫請求轉發到從庫伺服器,將寫操作和修改操作轉發到主庫伺服器。 ...
實驗環境
序號 | 主機名 | IP地址 | 備註 |
---|---|---|---|
1 | mysql-master | 192.168.204.201 | MySQL主庫 |
2 | mysql-slave | 192.168.204.202 | MySQL從庫 |
3 | appserver | 192.168.204.111 | 應用伺服器 |
安裝配置MySQL資料庫
1.使用yum安裝mysql和mysql-server
yum install -y mariadb mariadb-server
2.啟動mysql服務
systemctl start mariadb
systemctl enable mariadb
3.查看啟動狀態
systemctl status mariadb
netstat -anpt | grep "mysql" --color
4.允許3306埠通過防火牆
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
5.設置MySQL密碼
mysql_secure_installation
6.在mysql-master上創建資料庫
使用root
用戶登錄MySQL
mysql -uroot -p123456
創建資料庫並添加數據
create database db_test;
show databases;
use db_test;
create table if not exists user_info(
username varchar(16) not null,
password varchar(32) not null,
realname varchar(16) default '',
primary key (username)
)default charset=utf8;
show tables;
insert into user_info(username, password, realname) values
('10001', '123456', '小明'),
('10002', '123456', '小紅'),
('10003', '123456', '小王'),
('10004', '123456', '小張'),
('10005', '123456', '小李');
select * from user_info where 1;
在mysql-master
上授權資料庫訪問許可權
GRANT all ON db_test.* TO 'admin'@'%' identified BY '123456';
flush privileges;
在mysql-slave
、appserver
上登錄mysql-master
資料庫
mysql -h 192.168.204.201 -uroot -p123456
在mysql-master
上撤銷資料庫訪問許可權
REVOKE all ON db_test.* FROM 'admin'@'%';
flush privileges;
配置master和slave兩台mysql伺服器的主從複製
1.在master資料庫上啟用binlog日誌,建立從庫賬號rep
查看binlog日誌狀態
show variables like 'log_bin';
更改my.cnf
配置文件
cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
重啟MySQL,查看binlog日誌
systemctl restart mariadb
mysql -uroot -p123456 -e "show variables like 'log_bin';"
mysql -uroot -p123456 -e "show master status;"
記住此處File和Position的值
建立從庫賬號
grant replication slave on *.* to rep@'192.168.204.202' identified by '123456';
show grants for rep@'192.168.204.%';
2.在master資料庫上備份現有資料庫
對master資料庫鎖表
flush tables with read lock;
備份master資料庫
mysqldump -uroot -p123456 --all-databases | gzip > /root/database_`date '+%Y-%m-%d'`.sql.gz
將備份文件拷貝至slave
scp database_*.sql.gz [email protected]:/root
3. 配置slave資料庫,在slave上恢複數據庫
配置slave資料庫server-id
,關閉binlog日誌
cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
# vim /etc/my.cnf
#log-bin=mysql-bin
#binlog_format=mixed
server-id = 2
4.重啟slave的mysql
重啟mysql服務
systemctl restart mariadb
查看log_bin
和server_id
的值
show variables like 'log_bin';
show variables like 'server_id';
5.將數據恢復至slave
gzip -d /root/database_*.sql.gz
mysql -uroot -p123456 < /root/database_*.sql
mysql -uroot -p123456 -e "show databases;"
6.在slave資料庫上配置複製參數
在slave上配置複製參數
將MASTER_LOG_FILE
和MASTER_LOG_POS
的值替換成上述master上查詢的值
change master to
MASTER_HOST='192.168.204.201',
MASTER_USER='rep',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=245;
在slave上配置啟用複製
start slave;
在slave上查看複製狀態
show slave status \G;
兩個均為Yes
即可
重啟master和slave的mysql服務
systemctl restart mariadb
在master上為資料庫db_test
增加記錄,在slave查看同步情況
-- mysql-master
insert into db_test.user_info (username, password, realname) values ('20001', '123456', 'Tom');
select * from db_test.user_info where 1;
-- mysql-slave
select * from db_test.user_info where 1;
已經實現了主從複製
在appserver上配置mysql讀寫分離
1.在appserver上安裝mysql-proxy
從https://downloads.mysql.com/archives/proxy/
下載mysql-proxy
cd ~
wget https://downloads.mysql.com/archives/get/file/mysql-proxy-0.8.5-linux-sles11-x86-64bit.tar.gz
tar -xzvf mysql-proxy-0.8.5-linux-sles11-x86-64bit.tar.gz
cp -r mysql-proxy-0.8.5-linux-sles11-x86-64bit /usr/local/mysql-proxy
2.在appserver上配置mysql-proxy
創建主配置文件
cd /usr/local/mysql-proxy
mkdir lua #創建腳本存放目錄
mkdir logs #創建日誌目錄
cp share/doc/mysql-proxy/rw-splitting.lua ./lua/ #複製讀寫分離配置文件
cp share/doc/mysql-proxy/admin-sql.lua ./lua/ #複製管理腳本
vim /etc/mysql-proxy.cnf #創建配置文件
主配置文件內容
使用前,請去掉註釋
#vim /etc/mysql-proxy.cnf
[mysql-proxy]
user=root #運行mysql-proxy用戶
admin-username=myproxy #主從mysql共有的用戶
admin-password=123456 #用戶的密碼
proxy-address=127.0.0.1:3306 #mysql-proxy運行ip和埠,不加埠預設4040
proxy-read-only-backend-addresses=192.168.204.202 #指定後端從slave讀取數據
proxy-backend-addresses=192.168.204.201 #指定後端master寫入數據
proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua #指定讀寫分離配置文件位置
admin-lua-script=/usr/local/mysql-proxy/lua/admin-sql/lua #指定管理腳本
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log #日誌位置
log-level=info #定義log日誌級別,由高到低分別(error|warning|info|message|debug)
修改許可權
chmod 660 /etc/mysql-proxy.cnf
3.在appserver上修改讀寫分離配置文件
vim /usr/local/mysql-proxy/lua/rw-splitting.lua
修改以下內容
--- config
--
-- connection pool
if not proxy.global.config.rwsplit then
proxy.global.config.rwsplit = {
min_idle_connections = 1, -- 預設超過4個連接數時才開始讀寫分離
max_idle_connections = 1, -- 預設為8
is_debug = false
}
end
4.在appserver上啟動mysql-proxy
啟動
/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf --daemon
查看進程
netstat -anpt | grep 3306
5.在mysql-master和mysql-slave上分別給myproxy授權
在mysql-master
和mysql-slave
上授權給mysql-proxy
grant all on *.* to 'myproxy'@'192.168.204.%' identified by '123456';
flush privileges;
6.在appserver上連接mysql-proxy,測試讀寫分離
在appserver
上通過mysql-proxy
操作資料庫
mysql -h 127.0.0.1 -umyproxy -p123456 -e "select * from db_test.user_info where 1;"
mysql -h 127.0.0.1 -umyproxy -p123456 -e "insert into db_test.user_info (username, password, realname) values ('30001', '123456', 'Jack');"
mysql -h 127.0.0.1 -umyproxy -p123456 -e "select * from db_test.user_info where 1;"
在mysql-master
上查詢
mysql -uroot -p123456 -e "select * from db_test.user_info where 1;"
在mysql-master
上查詢
mysql -uroot -p123456 -e "select * from db_test.user_info where 1;"
經驗證,已實現讀寫分離