實現在同一臺linux主機上mysql主從複製與讀寫分離
環境情況:由於資源有限,僅在一臺CentOS release 6.6上實現M-S主從複製與讀寫分離
一、mysql安裝與配置
具體安裝過程建議參考我的上篇一部落格文章
二、mysql主從複製
主從伺服器場景如下
主(m) :172.30.204.111:3307
從1(s1):172.30.204.111:3308
從2(s2):172.30.204.111:3309
[[email protected] dingmingyi]# netstat-anlpt|grep mysql
tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 19411/mysqld
tcp 0 0 0.0.0.0:3308 0.0.0.0:* LISTEN 19734/mysqld
tcp 0 0 0.0.0.0:3309 0.0.0.0:* LISTEN 20202/mysqld
2.1主伺服器操作:
[[email protected] dingmingyi]# cat /usr/local/mysql-m/etc/my.cnf [mysqld] basedir=/usr/local/mysql-m datadir=/opt/database-m socket=/var/run/mysql-m/mysql-m.sock pid-file=/var/run/mysql-m/mysql-m.pid port=3307 user=mysql server-id=1 log-bin=mysql-bin binlog_ignore_db=mysql character_set_server=utf8 [mysqld_safe] log-error=/var/log/mysql-m/mysql--error.log [mysql] socket = /var/run/mysql-m/mysql-m.sock default-character-set=utf8 |
只要在my.cnf裡面新增內容都要重新啟動服務#service mysql-m restart
[[email protected] dingmingyi]#/usr/local/mysql-m/bin/mysqladmin -uroot password '321321' -S /var/run/mysql-m/mysql-m.sock #為M-mysql設定密碼;
[[email protected] dingmingyi]# /usr/local/mysql-m/bin/mysql-uroot -p321321 -S /var/run/mysql-m/mysql-m.sock
授權給從伺服器
mysql> grant replication slave on *.* [email protected] identified by '123123';
mysql> grant replication slave on *.* [email protected] identified by '123123';
mysql>flush privileges;
查詢主資料庫狀態
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 670 | | mysql | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) |
記錄file和position的值,在配置從伺服器時需要用到
2.2從伺服器操作
修改從伺服器配置檔案/usr/local/mysql-s1/etc/my.cnf
將server-id=10 ,確保此id與主伺服器不同 #設定多個從伺服器必須與M-S和S-S都不同
同樣在[mysql]下增加default-character-set=utf8 ,在[mysqld]下增加character_set_server=utf8
重啟服務
登陸從伺服器
/usr/local/mysql-s1/bin/mysql -uroot -p -S/var/run/mysql-s1/mysql-s1.sock #由於沒設密碼,可以直接回車進入
執行同步語句
>change master to master_host='localhost', master_user='s1', master_password='123123', master_log_file='mysql-bin.000001', master_log_pos=670, master_port=3307; #一定要指定相應的埠號,不然在檢視狀態時會出錯 >start slave; |
mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: localhost Master_User: s1 Master_Port: 3307 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 670 Relay_Log_File: mysql-s1-relay-bin.000002 Relay_Log_Pos: 283 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes #以下兩排都要為YES才表明狀態正常 Slave_SQL_Running: Yes Replicate_Do_DB: …………………………..省略若干………………………………… |
另一從伺服器也做類似以上操作。
2.3 驗證主從複製效果
主伺服器上操作
mysql> create database ding; Query OK, 1 row affected (0.00 sec) mysql> create table ding.d_tb(id int(3),name char(16),age char(4)); Query OK, 0 rows affected (0.14 sec) mysql> insert into ding.d_tb values(001,'xixi','23'); Query OK, 1 row affected (0.03 sec) |
兩臺從伺服器上都可以檢視相同的內容
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | ding | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec) mysql> use ding; Database changed mysql> show tables; +------------------+ | Tables_in_d_test | +------------------+ | d_tb | +------------------+ 1 row in set (0.00 sec) mysql> select * from ding.d_tb; +------+------+------+ | id | name | age | +------+------+------+ | 1 | xixi | 23 | +------+------+------+ 1 row in set (0.00 sec) |
同步成功!!!
三、Mysql-proxy讀寫分離
Mysql-proxy代理:將寫操作分到mysql-master,讀操作分到mysql-slave
Mysql-proxy的讀寫分離是通過rw-splitting.lua指令碼實現,因此需要安裝lua
3.1安裝lua
[[email protected] dingmingyi]# yum -y install gcc gcc-c++ libedit libedit-devel libtermcap-devel ncurses-devel libevent-devel readline-devel [[email protected] dingmingyi]# wget http://www.lua.org/ftp/lua-5.2.3.tar.gz [[email protected] dingmingyi]# tar zxvf lua-5.2.3.tar.gz [[email protected] dingmingyi]#cd lua-5.2.3 [[email protected] lua-5.2.3]#make linux [[email protected] lua-5.2.3]#make install |
3.2 下載mysql-proxy
[[email protected] dingmingyi]# tar zxvf mysql-proxy-0.8.4-linux-glibc2.3-x86-64bit.tar.gz [[email protected] dingmingyi]# mv mysql-proxy-0.8.4-linux-glibc2.3-x86-64bit /usr/local/mysql_proxy [[email protected] dingmingyi]# cd /usr/local/mysql_proxy/ [[email protected] mysql_proxy]# mkdir scripts [[email protected] mysql_proxy]# cp share/doc/mysql-proxy/rw-splitting.lua scripts/ [[email protected] mysql_proxy]# vim scripts/rw-splitting.lua if not proxy.global.config.rwsplit then proxy.global.config.rwsplit = { min_idle_connections = 1, #預設4 改為1,表示最小連結數只有超過1時才會進行讀寫分離 max_idle_connections = 1, #預設8 is_debug = false } end [[email protected] mysql_proxy]# vim proxy.conf #此為手動建立 1 [mysql-proxy] 2 admin-username=proxy 3 admin-password=123123 4 5 admin-lua-script=/usr/local/mysql_proxy/lib/mysql-proxy/lua/admin.lua #定義管理指令碼路徑 6 proxy-read-only-backend-addresses=172.30.204.111:3308,172.30.204.111:3309 #讀伺服器地址 7 proxy-backend-addresses=172.30.204.111:3307 #寫伺服器地址 8 proxy-lua-script=/usr/local/mysql_proxy/scripts/rw-splitting.lua #讀寫分離指令碼路徑 9 log-file=/var/log/mysql-proxy.log 10 log-level=debug 11 daemon=true 12 keepalive=true ~ [[email protected] mysql_proxy]# chmod 660 proxy.conf [[email protected] mysql_proxy]# bin/mysql-proxy -P 172.30.204.111:3310 --defaults-file=/usr/local/mysql_proxy/proxy.conf [[email protected] mysql_proxy]# lsof -i:3310 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysql-pro 1416 root 10u IPv4 1011376 0t0 TCP master.jay.com:dyna-access (LISTEN) |
登陸主伺服器上
mysql> grant all on *.* to [email protected]'%'identified by '123123';
mysql>flush privileges;
由於配置了主從複製,可以在從資料庫伺服器上檢視到同步的資料
從伺服器上 mysql> select host,user,password from mysql.user; +----------------+-------+-------------------------------------------+ | host | user | password | +----------------+-------+-------------------------------------------+ | localhost | root | | | master.jay.com | root | | | 127.0.0.1 | root | | | ::1 | root | | | localhost | | | | master.jay.com | | | | % | proxy | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 | +----------------+-------+-------------------------------------------+ 7 rows in set (0.00 sec) |
為了更顯著看到讀寫分離效果,現將兩臺slave關閉
mysql> stop slave;
注:這裡以ding.d_tb為測試資料庫,由於前面進行主從複製,在從伺服器中也存在ding.d_tb庫。
為了看到單點效果,現做如下操作:
mysql> insert into ding.d_tbvalues(004,'master','4'); ----〉主伺服器
mysql> insert into ding.d_tbvalues(005,'slave-1','5'); -----〉從伺服器 s1
mysql> insert into ding.d_tbvalues(006,'slave-2','6'); ----->從伺服器s2
測試機已安裝mysql,現遠端連線mysql-proxy
[[email protected] mysql-p]# bin/mysql -uproxy -p123123 -h172.30.204.111 -P3310 –e” insert into d_tb values(002,'dingding','25');” #插入資料 [[email protected] mysql-p]# bin/mysql -uproxy -p123123 -h172.30.204.111 -P3310 mysql> select * from ding.d_tb; #此時看到的是從伺服器s1上的資料,上一步新增的資料沒有 +------+----------+------+ | id | name | age | +------+----------+------+ | 1 | xixi | 23 | | 2 | haha | 24 | | 2 | dingding | 25 | | 5 | slave-1 | 5 | +------+----------+------+ 4 rows in set (0.00 sec) |
去主庫中查詢:
mysql> select * from ding.d_tb; +------+----------+------+ | id | name | age | +------+----------+------+ | 1 | xixi | 23 | | 2 | haha | 24 | | 2 | dingding | 25 | | 4 | master | 4 | | 2 | dingding | 25 | +------+----------+------+ 資料已插入 |
最後檢查從資料庫
S1:
mysql> select * from ding.d_tb; +------+----------+------+ | id | name | age | +------+----------+------+ | 1 | xixi | 23 | | 2 | haha | 24 | | 2 | dingding | 25 | | 5 | slave-1 | 5 | +------+----------+------+ 4 rows in set (0.00 sec) |
S2:
mysql> select * from ding.d_tb; +------+----------+------+ | id | name | age | +------+----------+------+ | 1 | xixi | 23 | | 2 | haha | 24 | | 2 | dingding | 25 | | 6 | slave-2 | 6 | +------+----------+------+ 4 rows in set (0.00 sec) |
由於關閉了主從同步,也沒有記錄。
現停掉S1服務 #service mysql-s1 stop
再次登陸測試機
[[email protected] mysql-p]# bin/mysql -uproxy -p123123 -h172.30.204.111 -P3310 Warning: Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.6.24-debug Source distribution Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select * from ding.d_tb; +------+----------+------+ | id | name | age | +------+----------+------+ | 1 | xixi | 23 | | 2 | haha | 24 | | 2 | dingding | 25 | | 6 | slave-2 | 6 | +------+----------+------+ 4 rows in set (0.00 sec) 發現已自動切到S2上讀取資料了 |
由此驗證,已經實現mysql讀寫分離,目前寫操作都在master主伺服器上,用了避免資料不同步;讀操作都分攤給其他各個slave從伺服器,用來分擔資料庫壓力。
===================================================================
配置過程出現的問題及相應的解決方法
1、mysql> showmaster status;
Empty set (0.00 sec)
解決:沒開啟log-bin導致。在主伺服器my.cnf中[mysqld]新增log-bin=mysql-bin,重啟
2、mysql> show slavestatus\G;
*************************** 1. row***************************
Slave_IO_State: Connecting tomaster
Master_Host: localhost
Master_User: s1
Master_Port: 3308
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 120
Relay_Log_File:mysql-s1-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
解決:
對照以下三條:網路不通、密碼不對、pos不對
>stop slave;
>change master to
master_host='localhost',
master_user='s1',
master_password='123123',
master_log_file='mysql-bin.000001',
master_log_pos=120,
master_port=3307; #一定要指定埠號
>start slave;
3、mysql> show slavestatus\G;
……………….省略若干………………….
ERROR:
No query specified
解決:mysql> show slave status\G不要後面的;(==》分號)
4、# make linux
cd src && make linux
make[1]: Entering directory`/home/dingmy/lua-5.2.4/src'
make allSYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl-lreadline"
make[2]: Entering directory `/home/dingmy/lua-5.2.4/src'
gcc -O2 -Wall -DLUA_COMPAT_ALL-DLUA_USE_LINUX -c -o lua.o lua.c
lua.c:67:31: error: readline/readline.h: Nosuch file or directory
lua.c:68:30: error: readline/history.h: Nosuch file or directory
lua.c: In function ?.ushline?.
lua.c:265: warning: implicit declaration offunction ?.eadline?
lua.c:265: warning: assignment makespointer from integer without a cast
lua.c: In function ?.oadline?.
lua.c:297: warning: implicit declaration offunction ?.dd_history?
make[2]: *** [lua.o] Error 1
make[2]: Leaving directory`/home/dingmy/lua-5.2.4/src'
make[1]: *** [linux] Error 2
make[1]: Leaving directory`/home/dingmy/lua-5.2.4/src'
make: *** [linux] Error 2
解決:yum install readline-devel
5、
[[email protected] dingmingyi]#/usr/local/mysql-m/bin/mysql -uroot -p321321 -S /var/run/mysql-m/mysql-m.sock
Warning: Using a password on the commandline interface can be insecure.
/usr/local/mysql-m/bin/mysql: Unknown OScharacter set 'GB18030'.
/usr/local/mysql-m/bin/mysql: Switching tothe default character set 'latin1'.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.24-debug-log Sourcedistribution
Copyright (c) 2000, 2015, Oracle and/or itsaffiliates. All rights reserved.
Oracle is a registered trademark of OracleCorporation and/or its
affiliates. Other names may be trademarksof their respective
owners.
Type 'help;' or '\h' for help. Type '\c' toclear the current input statement.
mysql>
解決:
# vim /usr/local/mysql-m/etc/my.cnf
在[mysql]下增加default-character-set=utf8
在[mysqld]下增加character_set_server=utf8
# service mysql-m restart
6、[[email protected] mysql-p]#bin/mysql -uproxy -p123123 -P3310 -h172.30.204.111
Warning: Using a password on the commandline interface can be insecure.
ERROR 1045 (28000): Access denied for user'proxy'@'master.jay.com' (using password: YES)
解決:進入主伺服器中
mysql> select host,user,password frommysql.user;
+----------------+--------+-------------------------------------------+
| host | user | password |
+----------------+--------+-------------------------------------------+
| localhost | root | *4160291B4C8CC2573CC94951203FFBC858754907 |
| master.jay.com | root | |
| 127.0.0.1 |root | |
| ::1 | root | |
| localhost | | |
| master.jay.com | | |
| localhost | s1 | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |
| localhost | s2 | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |
| % | proxy | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |
| % | proxy1 |*E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |
+----------------+--------+-------------------------------------------+
10 rows in set (0.00 sec)
mysql> delete from mysql.user wherehost='master.jay.com'; #刪除host=master.jay.com
Query OK, 2 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
重新連線mysql-proxy成功!!
相關推薦
實現在同一臺linux主機上mysql主從複製與讀寫分離
環境情況:由於資源有限,僅在一臺CentOS release 6.6上實現M-S主從複製與讀寫分離 一、mysql安裝與配置 具體安裝過程建議參考我的上篇一部落格文章 二、mysql主從複製 主從伺服器場景如下 主(m) :172.30.204.111:3307 從1
部署MySQL主從複製與讀寫分離
一、實驗壞境 1.一臺CentOS 7作為客戶端測試,對應的地址為:192.168.80.1202.一臺CentOS 7作為Amoeba前端代理伺服器,對應的地址為:192.168.80.1103.一臺CentOS 7作為mysql主伺服器,對應的地址為:192.168.80.1004.兩臺CentOS 7
mysql主從複製與讀寫分離
主從複製原理:在主資料庫執行後,都會寫入本地的日誌系統A中。假設,實時的將變化了的日誌系統中的資料庫事件操作,在主資料庫的3306埠,通過網路發給從資料。從資料庫收到後,寫入本地日誌系統B,然後一條條的將資料庫事件在資料庫中完成。那麼,主資料庫的變化,從資料庫
mysql主從複製與讀寫分離配置詳解
mysql主從複製與讀寫分離配置詳解 當網站達到一定規模時,資料庫最先出現壓力,這時候使用者會明顯感覺到卡頓,其原因是資料庫的寫入操作,影響了查詢的效率。這時可以考慮對資料庫配置主從複製和讀寫分離。設定多臺資料庫伺服器,包括一個主伺服器和n個從伺服器,主伺服器負責寫入資料,從伺服器負
【純幹貨】Amoeba實現MySQL主從同步與讀寫分離
exec strong arc all abstract a star status utf prop 【純幹貨】Amoeba實現MySQL主從同步與讀寫分離 一、簡介 amoeba簡介 Amoeba(變形蟲)項目,該開源框架於2008年開始發布一款 Amoeba f
【Mycat】資料庫效能提升利器(三)——Mycat實現Mysql主從複製和讀寫分離
一、前言 在前一篇文章中,小編向大家 介紹了使用Mycat水平切分資料庫。可以說,使用了水平分庫後,資料庫提升還是很高的。如果想更高的提高資料庫效能,就可以考慮對Mysql進行主從複製和讀寫分離了。 在這篇部落格中,小編就向大家介紹基於Mycat的M
CentOS6.5搭建MySQL主從複製,讀寫分離(冷月宮主親自整理,最簡單明瞭)
CentOS6.5搭建MySQL主從複製,讀寫分離MySQL主從複製的優點:1、 如果主伺服器出現問題, 可以快速切換到從伺服器提供的服務,保證高可用性2、 可以在從伺服器上執行查詢操作, 降低主伺服器的訪問壓力3、 可以在從伺服器上執行備份, 以避免備份期間影響主伺服器的服
MySQL主從同步與讀寫分離
修改配置 monit 相關 流量 修改配置文件 l數據庫 cli 授權 san MySQL主從同步MySQL AB復制1.對指定庫的異地同步。2.MySQL主-->從復制架構的實現。3.MySQL服務器的只讀控制。 主從:單向復制時,建議將從庫設置為只讀。 主從復制
MySQL高可用--主從複製與讀寫分離
一、Mysql高可用概念 二、MySQL主從複製原理 叢集目的,減輕單臺伺服器壓力 三、MySQL主從複製配置 實際操作mysql伺服器叢集,主從複製的過程 master 192.168.230.128 slav
MySQL的主從複製與讀寫分離
一、主從複製 1.伺服器資訊:主伺服器:192.168.48.4 從伺服器:192.168.48.5 均已安裝mysql 2.配置主伺服器中的 /etc/my.cnf 檔案,設定伺服器id和開啟日誌功能。設定完後儲存。進入mysql客戶端,通過show VARIAB
[MySQL高階](七) MySQL主從複製及讀寫分離實戰
1. 簡介 隨著技術的發展,在實際的生產環境中,由單臺MySQL資料庫伺服器不能滿足實際的需求。此時資料庫叢集就很好的解決了這個問題。採用MySQL分散式叢集,能夠搭建一個高併發、負載均衡的叢集伺服器。在此之前我們必須要保證每臺MySQL伺服器裡的資料同步。資料同步我們
mysql主從複製、讀寫分離、分庫分表、分片
第1章 引言 隨著網際網路應用的廣泛普及,海量資料的儲存和訪問成為了系統設計的瓶頸問題。對於一個大型的網際網路應用,每天幾十億的PV無疑對資料庫造成了相當高的負載。對於系統的穩定性和擴充套件性造成了極大的問題。通過資料切分來提高網站效能,橫向擴充套件資料層已經成為架構研發人員首選的方式。 水平切分資料庫:可
[mysql終極優化]之主從複製與讀寫分離詳細設定教程
記下File及Position下的值。以備在配置從伺服器時使用。 注:File:當前binlog的檔名,每重啟一次mysql,就會生成一個新binlog檔案 Position:當前binlog的指標位置 三、從伺服器配置 1、配置mysql.cnf # vi /etc/my.cnf (1)修改
SpringBoot微服務 +tomcat叢集+Ngnix負載均衡+Mysql主從複製,讀寫分離(4)
四:mysql主從複製,讀寫分離 1.首先把mysql原始碼包檔案拷到兩臺linux伺服器上,然後在兩臺伺服器上安裝Mysql資料庫 安裝 MySQL 1 安裝 ncurses Ncurses 提供字元終端處理庫,包括面板和選單。它提供了
一步一圖搭建-分散式伺服器部署之mysql叢集-主從複製與讀寫分離
傳統專案模型: 1.傳統的裝置搭建時,如果採用單臺伺服器.則會出現很多的問題.如果伺服器出現宕機/斷電/硬體裝置的損壞,都會直接影響使用者體驗. 2.如果傳統專案中遇到了高併發的情況.單臺伺服器不足以支援 分散式的處理: 傳統資料庫中存在
mysql主從複製、讀寫分離到資料庫水平拆分及庫表雜湊
web專案最原始的情況是一臺伺服器只能連線一個mysql伺服器(c3p0只能配置一個mysql),但隨著專案的增大,這種方案明顯已經不能滿足需求了。Mysql主從複製,讀寫分離:上面的方案使用mysql-Proxy代理,分發讀寫請求,寫操作轉發到Mysql主伺服器,讀操作轉發
Mysql主從複製、讀寫分離+MyCat資料庫中介軟體
最近搭建了 MySQL 主從 並使用MyCat作為資料庫中介軟體 版本: Mysql 5.5.48 Linux :CentOS 6.8 MyCat : 1.4 節點: 192.168.152.11Cluster1 192.168.152.12Cluster2 192.1
使用Mycat實現Mysql資料庫的主從複製、讀寫分離、分表分庫、負載均衡和高可用
Mysql叢集搭建 使用Mycat實現Mysql資料庫的主從複製、讀寫分離、分表分庫、負載均衡和高可用(Haproxy+keepalived),總體架構: 說明:資料庫的訪問通過keepalived的虛擬IP訪問HAProxy負載均衡器,實現HAProxy的高可用,HAProxy用於實
MySQL搭建主從伺服器與讀寫分離的實現
一 丶為什麼要搭建主從伺服器和實現讀寫分離 1.總結起來就一點,實現併發吞吐和負載能力。通過搭建主從伺服器實現讀寫分離,提高MySQL的負載能力 2.主從的基本實現原理 (本例 主伺服器ip: 192.168.2.187,後面簡稱 master;從伺服器ip: 192.168
mysql 主從實戰及讀寫分離
logs 啟動 毫秒 class -- systemctl position 讀寫 mas 1. MYSQL主從原理 1) 至少需要2臺數據庫服務器,一主一從,Master開啟bin-log功能用於記錄主庫增加、刪除、修改、更新SQL語句。 2) 異步復