1. 程式人生 > >主從同步、讀寫分離、mysql性能調優(軟優化)

主從同步、讀寫分離、mysql性能調優(軟優化)

tab ren 主庫 its 使用命令 mysql lee 運行 lte

配置mysql主從同步
1 主從同步的作用:讓slave身份的數據庫服務器自動同步

master身份的數據庫服務器上的數據。

一、主數據庫服務器的配置192.168.4.12
1 用戶授權
mysql> grant replication slave on *.* to

slaveuser@"192.168.4.11" identified by "123456";
2 啟用binlog日誌
vim /etc/my.cnf
[mysqld]
server_id=12
log_bin=master12
binlog_format="mixed"
:wq
#systemctl stop mysqld
#systemctl start mysqld
#ls /var/lib/mysql/master12.*
#mysql -uroot -p123456
mysql> show master status;

二 、從數據庫服務器的配置192.168.4.11
1 驗證主庫的授權用戶
#ping 192.168.4.12
#mysql -h192.168.4.12 -uslaveuser -p123456
mysql> show grants;

2 修改配置文件指定server_id
vim /etc/my.cnf
[mysqld]
server_id=11
:wq

#systemctl stop mysqld
#systemctl start mysqld

3 設置自己是那臺主機的從庫
#mysql -uroot -p123456
mysql> show slave status;
mysql> change master to

master_host="192.168.4.12",
master_user="slaveuser",
master_password="123456",
master_log_file="master12.000001",
master_log_pos=154;
mysql>show slave status\G;
mysql> start slave;
mysql>show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

三測試主從同步配置
客戶端訪問主庫時 產生的數據在從庫上都可以看的到。


從庫暫時不同步主庫的數據
mysql> stop slave;


把從庫恢復為獨立的數據庫服務器
#rm -rf master.info localhost-relay-bin.* relay-

log.info
#systemctl stop mysqld ; systemctl start mysqld

四、主從同步工作過程
cd /var/lib/mysql/
master.info 連接主庫信息
localhost-relay-bin.000001 中繼日誌文件
localhost-relay-bin.index 日誌索引文件
relay-log.info 中繼日誌信息

IO線程 :負責把主庫binlog裏的sql命令保存到本機的中繼日

誌文件裏。

報錯原因: 連接不上主庫服務器(ping selinux firewalld

grant binlog日誌指定錯誤)

Last_IO_Error: 報錯信息

解決錯誤
mysql> stop slave;
mysql> change master to 選項=值,選項=值;
mysql> start slave;

SQL線程:執行本機中繼日誌文件裏的sql命令把數據寫進庫裏


報錯原因:本機沒有執行日誌文件裏sql命令時,使用的庫或表

Last_SQL_Error: 報錯信息


解決辦法:讓從庫有主庫比自己多的數據,然後 stop slave ;start slave;
++++++++++++++++++++++++++++++++++
五、主從同步結構
一主一從 *
一主多從 *
主從從
主主結構(互相主從)
++++++++++++++++++++++++++++++++++++
主從同步配置常用參數
vim /etc/my.cnf
/etc/my.cnf
[mysqld]
....
:wq
#systemctl restart mysqld
#mysql>show master status;

主數據服務器使用的參數
binlog_do_db=db1,db2 只允許同步本機庫1和庫2
binlog_ignore_db=db1,db2 只不允許同步本機庫1和庫2

從數據服務器使用的參數
log_slave_updates 允許級聯復制(主從從)
replicate_do_db=db1,db2 只同步庫1和庫2
replicate_ignore_db=db1,db2 只不同步庫1和庫2
relay_log=名 指定中繼日誌文件名

五、mysql讀寫分離 (第三方軟件 + 主從同步)
1 什麽讀寫分離:把不同操作給不同的數據庫服務器處理
2 為什麽要做讀寫分離:減輕服務器的並發訪問壓力同時提高硬

件利用率。

實現讀寫分離
第三方軟件 :有很多 統稱mysql中間件 不同的中間件軟件有不

同的功能,大多數都是開源 (mysql-proxy mysql-mmm

mycat maxscale*)

主從同步結構(一主一從 )
要求:把數據庫服務器11 配置為數據庫服務器12的從服務器。

1、配置12
1.1 用戶授權
1.2 啟用binlog日誌

2、配置11
2.1 測試授權用戶
2.2 設置server_id
2.3 管理員帳號登錄,設置自己為12的從數據庫服務器
2.4 查看IO線程和SQL線程的狀態

3、在客戶端測試主從同步配置
3.1 在主數據庫服務器上添加對數據有訪問權限的用戶
mysql> grant all on bbsdb.* to webadmin@"%"

identified by "123456";
mysql> create database bbsdb;

使用主數據庫服務器上授權用戶連接主數據庫服務器,建庫,建

表,連接從數據庫時,也能夠看到新創建的庫和表。
#mysql -h192.168.4.12 -uwebadmin -p123456

3 配置實現讀寫分離功能的服務器(13)
3.1 能夠和2臺數據庫服務器通信
#ping 192.168.4.11/12
3.2 安裝軟件maxscale-2.1.2-1.rhel.7.x86_64.rpm
#rpm -ivh maxscale-2.1.2-1.rhel.7.x86_64.rpm(根據提示

安裝依賴包)
#rpm -ql maxscale
#rpm -qc maxscale

3.3 修改配置文件
# grep -v ‘#‘ /etc/maxscale.cnf.template >

/etc/maxscale.cnf

[root@mysql-13 ~]# cat /etc/maxscale.cnf
[maxscale]
threads=1

[server1]
type=server
address=192.168.4.11
port=3306
protocol=MySQLBackend

[server2]
type=server
address=192.168.4.12
port=3306
protocol=MySQLBackend

[MySQL Monitor]
type=monitor
module=mysqlmon
servers=server1,server2
user=scalemon
passwd=111111
monitor_interval=10000

[Read-Write Service]
type=service
router=readwritesplit
servers=server1,server2
user=maxscale
passwd=111111
max_slave_connections=100%

[MaxAdmin Service]
type=service
router=cli

[Read-Write Listener]
type=listener
service=Read-Write Service
protocol=MySQLClient
port=4006

[MaxAdmin Listener]
type=listener
service=MaxAdmin Service
protocol=maxscaled
socket=default
port=4008
[root@mysql-13 ~]#

[maxscale] 定義服務運行時啟動的線程數量
[server數字] 定義數據庫服務器ip地址
[MySQL Monitor] 定義監控成員列表
[Read-Write Service]定義讀寫分離主機列表
[MaxAdmin Service] 定義管理服務
[Read-Write Listener]定義讀寫分離服務使用的端口
[MaxAdmin Listener]定義管理服務使用的端口


根據配置文件裏設置,在數據庫服務器上添加對應的授權用戶
mysql>grant replication slave, replication client on *.*

to scalemon@‘%‘ identified by “111111”;

mysql> grant select on mysql.* to maxscale@‘%‘

identified by "111111";

3.4 啟動服務
# maxscale -h
# maxscale -f /etc/maxscale.cnf
[root@mysql-13 ~]# netstat -utnalp | grep maxscale
tcp 0 0 192.168.4.13:39870 192.168.4.12:3306

ESTABLISHED 12412/maxscale
tcp 0 0 192.168.4.13:32980 192.168.4.11:3306

ESTABLISHED 12412/maxscale
tcp6 0 0 :::4008 :::* LISTEN

12412/maxscale
tcp6 0 0 :::4006 :::* LISTEN

12412/maxscale
[root@mysql-13 ~]#


在本機連接管理端口查看監控主機的狀態
[root@mysql-13 ~]# maxadmin -P 4008 -pmariadb
MaxScale> list servers
Servers.
-------------------+-----------------+-------+-------------

+--------------------
Server | Address | Port | Connections |

Status
-------------------+-----------------+-------+-------------

+--------------------
server1 | 192.168.4.11 | 3306 | 0 | Slave,

Running
server2 | 192.168.4.12 | 3306 | 0 | Master,

Running
-------------------+-----------------+-------+-------------

+--------------------
MaxScale> list ser
Unknown or missing option for the list command. Valid

sub-commands are:
clients List all clients
dcbs List all DCBs
filters List all filters
listeners List all listeners
modules List all currently loaded modules
monitors List all monitors
services List all the services
servers List all servers
sessions List all sessions
threads List polling threads
commands List registered commands
MaxScale> quit


4 在客戶端測試讀寫分離
mysql -h192.168.4.13 -P 4006 -uwebadmin -

p123456
mysql> select * from bbsdb.a;
insert insert into bbsdb.a values(1001);

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mysql性能調優(軟優化)
維護的數據庫服務器響應客戶端請求慢,可能是什麽原因導致的?
1.1網絡帶寬窄(使用網絡測速軟件)

1.2服務器硬件配置過低(CPU 內存 存儲)
使用命令或監控軟件監視 使用情況 (top free -m )


1.3提供數據庫服務軟件版本低
如何知道是否是軟件版本低,查看服務運行時的參數信息
/etc/my.cnf
[mysqld]
變量名=值
:wq

#mysql -uroot -p123456
查看參數值
mysql> show variables like "%timeout%";
mysql> show variables like "connect_timeout";

修改參數值
mysql> set 變量名=值;
mysql> set global 變量名=值;

mysql> SET GLOBAL connect_timeout=5;

常用變量的設置:
1 並發連接數 max_connections
mysql> show processlist

mysql> show global status like "max_used_connections";

max_used_connections/max_connections=0.85

2建立連接3次握手超時時間
connect_timeout

3 連接建立後,關閉某個不活動連接的超時時間
wait_timeout 28800

4 線程數量:允許保存在緩存中被重用的線程數量
thread_cache_size

5 為所有線程緩存的打開的表的數量
table_open_cache


6 與查詢緩存相關的參數

select * from t1; read_buffer_size

select * from t1 where name like "a%"; key_buffer-size
seletct * from t1 group by sex; read_rnd_buffer_siz
seletct * from t1 order by 成績; sort_buffer_size

查詢優化
闡述mysql數據服務器處理查詢請求的過程?


mysql> show variables like "query_cache%";
query_cache_type=0/1/2

0 不允許存
1 無條件存儲
2 要設置把查詢結果記錄到查詢緩存裏才存儲

select in_sql_cache * from t1;

query_cache_wlock_invalidate off
myisam存儲引擎的表


pc1 select name from t1 where name="jim"
name="jim"

pc2 select name from t1 where name="jim";
pc3 update t1 set name="tom" where name="jim";

顯示查詢緩存統計信息
mysql> show global status like "qcache%";
Qcache_hits 30
Qcache_inserts 100
Qcache_lowmem_prunes 10
Qcache_not_cached

1.4 程序員訪問數據的sql命令復雜導致處理速度慢
mysql數據庫服務啟用慢查詢日誌 ,記錄客戶端連接後服務後,

超過指定時間顯示查詢結果sql命令。

mysql數據庫服務的日誌類型?
錯誤日誌 binlog日誌 查詢日誌 慢查詢日誌
默認啟用的

vim /etc/my.cnf
[mysqld]
選項
:wq
#systemctl stop mysqld;
#systemctl start mysqld;

錯誤日誌:記錄服務在啟動和運行過程中產生的錯誤信息
log-error=/var/log/mysqld.log

查詢日誌 :記錄客戶端連接後服務後,執行的所有sql命令。
[mysqld]
general-log


cat /var/lib/mysql/主機名.log

慢查詢日誌:記錄客戶端連接後服務後,超過指定時間顯示查詢結果sql命令。

[mysqld]
slow-query-log

mysql> select sleep(11);
# cat /var/lib/mysql/主機名-slow.log
#mysqldumpslow /var/lib/mysql/主機名-slow.log > /tmp/sql.txt

1.5 網絡結構不合理

主從同步、讀寫分離、mysql性能調優(軟優化)