1、搭建mysql服務(wù)器,并實(shí)現(xiàn)主主復(fù)制、半同步復(fù)制
存儲(chǔ)引擎:
表類型:也稱為“表類型”,表級(jí)別概念,不建議在同一個(gè)庫中的表上使用不同的ENGINE;
CREATE TABLE ... ENGINE[=]STORAGE_ENGINE_NAME ...
SHOW TABLE STATUS
常見的存儲(chǔ)引擎:
MyISAM, Aria, InnoDB, MRG_MYISAM, CSV, BLACKHOLE, MEMORY, PERFORMANCE_SCHEMA, ARCHIVE, FEDERATED
InnoDB:InnoBase
Percona-XtraDB, Supports transactions, row-level locking, and foreign keys
數(shù)據(jù)存儲(chǔ)于“表空間(table space)"中:
(1) 所有數(shù)據(jù)庫中的所有類型為InnoDB的表的數(shù)據(jù)和索引存儲(chǔ)于同一個(gè)表空間中;
表空間文件:datadir定義的目錄中
文件:ibdata1, ibdata2, ...
(2) innodb_file_per_table=ON,意味著每表使用單獨(dú)的表空間文件;
每表的數(shù)據(jù)文件(數(shù)據(jù)和索引,存儲(chǔ)于數(shù)據(jù)庫目錄)存儲(chǔ)于自己專用的表空間文件中,并存儲(chǔ)于數(shù)據(jù)庫目錄下: tbl_name.ibd
表結(jié)構(gòu)的定義:在數(shù)據(jù)庫目錄,tbl_name.frm
事務(wù)型存儲(chǔ)引擎,適合對(duì)事務(wù)要求較高的場景中;但較適用于處理大量短期事務(wù);
基于MVCC(Mutli Version Concurrency Control)支持高并發(fā);支持四個(gè)隔離級(jí)別,默認(rèn)級(jí)別為REPEATABLE-READ;間隙鎖以防止幻讀;
使用聚集索引(主鍵索引);
支持”自適應(yīng)Hash索引“;
鎖粒度:行級(jí)鎖;間隙鎖;
總結(jié):
數(shù)據(jù)存儲(chǔ):表空間;
并發(fā):MVCC,間隙鎖,行級(jí)鎖;
索引:聚集索引、輔助索引;
性能:預(yù)讀操作、內(nèi)存數(shù)據(jù)緩沖、內(nèi)存索引緩存、自適應(yīng)Hash索引、插入操作緩存區(qū);
備份:支持熱備;
MyISAM:
支持全文索引(FULLTEXT index)、壓縮、空間函數(shù)(GIS);
不支持事務(wù)
鎖粒度:表級(jí)鎖
崩潰無法保證表安全恢復(fù)
適用場景:只讀或讀多寫少的場景、較小的表(以保證崩潰后恢復(fù)的時(shí)間較短);
文件:每個(gè)表有三個(gè)文件,存儲(chǔ)于數(shù)據(jù)庫目錄中
tbl_name.frm:表格式定義;
tbl_name.MYD:數(shù)據(jù)文件;
tbl_name.MYI:索引文件;
特性:
加鎖和并發(fā):表級(jí)鎖;
修復(fù):手動(dòng)或自動(dòng)修復(fù)、但可能會(huì)丟失數(shù)據(jù);
索引:非聚集索引;
延遲索引更新;
表壓縮;
行格式:
{DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
其它的存儲(chǔ)引擎:
CSV:將CSV文件(以逗號(hào)分隔字段的文本文件)作為MySQL表文件;
MRG_MYISAM:將多個(gè)MyISAM表合并成的虛擬表;
BLACKHOLE:類似于/dev/null,不真正存儲(chǔ)數(shù)據(jù);
MEMORY:內(nèi)存存儲(chǔ)引擎,支持hash索引,表級(jí)鎖,常用于臨時(shí)表;
FEDERATED: 用于訪問其它遠(yuǎn)程MySQL服務(wù)器上表的存儲(chǔ)引擎接口;
MariaDB額外支持很多種存儲(chǔ)引擎:
OQGraph、SphinxSE、TokuDB、Cassandra、CONNECT、SQUENCE、...
搜索引擎:
lucene, sphinx
lucene:Solr, ElasticSearch
并發(fā)控制:
鎖:Lock
鎖類型 :
讀鎖:共享鎖,可被多個(gè)讀操作共享;
寫鎖:排它鎖,獨(dú)占鎖;
鎖粒度:
表鎖:在表級(jí)別施加鎖,并發(fā)性較低;
行鎖:在行級(jí)別施加鎖,并發(fā)性較高;維持鎖狀態(tài)的成本較大;
鎖策略:在鎖粒度及數(shù)據(jù)安全性之間尋求一種平衡機(jī)制;
存儲(chǔ)引擎:級(jí)別以及何時(shí)施加或釋放鎖由存儲(chǔ)引擎自行決定;
MySQL Server:表級(jí)別,可自行決定,也允許顯式請(qǐng)求;
鎖類別:
顯式鎖:用戶手動(dòng)請(qǐng)求的鎖;
隱式鎖:存儲(chǔ)引擎自行根據(jù)需要施加的鎖;
顯式鎖的使用:
(1) LOCK TABLES
LOCK TABLES? tbl_name? read|write, tbl_name read|write, ...
UNLOCK TABLES
(2) FLUSH TABLES
FLUSH TABLES tbl_name,... [WITH READ LOCK];
UNLOCK TABLES;
(3) SELECT cluase
[FOR UPDATE | LOCK IN SHARE MODE]
show processlist; #查看線程列表
手動(dòng)控制事務(wù):
啟動(dòng):START TRANSACTION
提交:COMMIT
回滾:ROLLBACK
事務(wù)支持savepoints:
SAVEPOINT identifier
ROLLBACK [WORK] TO [SAVEPOINT] identifier
RELEASE SAVEPOINT identifier
事務(wù)隔離級(jí)別:
READ-UNCOMMITTED:讀未提交 --> 臟讀;
READ-COMMITTED:讀提交--> 不可重復(fù)讀;
REPEATABLE-READ:可重復(fù)讀 --> 幻讀;
SERIALIZABLE:串行化;
mysql> SELECT @@session.tx_isolation;
+----------------------------------+
| @@session.tx_isolation |
+----------------------------------+
| REPEATABLE-READ? ? ? ? |
+----------------------------------+
查看InnoDB存儲(chǔ)引擎的狀態(tài)信息:
SHOW ENGINE innodb STATUS;
日志:
查詢?nèi)罩荆篻eneral_log
慢查詢?nèi)罩荆簂og_slow_queries
錯(cuò)誤日志:log_error, log_warnings
二進(jìn)制日志:binlog
中繼日志:relay_log
事務(wù)日志:innodb_log
1、查詢?nèi)罩?/p>
記錄查詢語句,日志存儲(chǔ)位置:
文件:file
表:table (mysql.general_log)
general_log={ON|OFF}
general_log_file=HOSTNAME.log
log_output={FILE|TABLE|NONE}
2、慢查詢?nèi)罩?/p>
慢查詢:運(yùn)行時(shí)間超出指定時(shí)長的查詢;
long_query_time
存儲(chǔ)位置:
文件:FILE
表:TABLE,mysql.slog_log
log_slow_queries={ON|OFF}
slow_query_log={ON|OFF}
slow_query_log_file=
log_output={FILE|TABLE|NONE}
log_slow_filter=admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk
log_slow_rate_limit
log_slow_verbosity
3、錯(cuò)誤日志
記錄信息:
(1) mysqld啟動(dòng)和關(guān)閉過程 輸出的信息;
(2) mysqld運(yùn)行中產(chǎn)生的錯(cuò)誤信息;
(3) event scheduler運(yùn)行時(shí)產(chǎn)生的信息;
(4) 主從復(fù)制架構(gòu)中,從服務(wù)器復(fù)制線程啟動(dòng)時(shí)產(chǎn)生的日志;
log_error=
/var/log/mariadb/mariadb.log|OFF
log_warnings={ON|OFF}
4、二進(jìn)制日志
用于記錄引起數(shù)據(jù)改變或存在引起數(shù)據(jù)改變的潛在可能性的語句(STATEMENT)或改變后的結(jié)果(ROW),也可能是二者混合;
功用:“重放”
binlog_format={STATEMENT|ROW|MIXED}
STATEMENT:語句;
ROW:行;
MIXED:混編;
查看二進(jìn)制日志文件列表:
SHOW MASTER|BINARY LOGS;
查看當(dāng)前正在使用的二進(jìn)制日志文件:
SHOW MASTER STATUS;
查看二進(jìn)制 日志文件中的事件:
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
服務(wù)器變量:
log_bin=/PATH/TO/BIN_LOG_FILE
只讀變量;
session.sql_log_bin={ON|OFF}
控制某會(huì)話中的“寫”操作語句是否會(huì)被記錄于日志文件中;
max_binlog_size=1073741824
sync_binlog={1|0}
mysqlbinlog:
YYYY-MM-DD hh:mm:ss
--start-datetime=
--stop-datetime=
-j, --start-position=#
? --stop-position=#
? --user, --host, --password
二進(jìn)制日志事件格式:
# at 553
#160831? 9:56:08 server id 1? end_log_pos 624? Query? thread_id=2? ? exec_time=0? ? error_code=0
SET TIMESTAMP=1472608568/*!*/;
BEGIN
/*!*/;
事件的起始位置:# at 553
事件發(fā)生的日期時(shí)間:#160831? 9:56:08
事件發(fā)生的服務(wù)器id:server id 1
事件的結(jié)束位置:end_log_pos 624
事件的類型:Query
事件發(fā)生時(shí)所在服務(wù)器執(zhí)行此事件的線程的ID: thread_id=2
語句的時(shí)間戳與將其寫入二進(jìn)制日志文件中的時(shí)間差:exec_time=0
錯(cuò)誤代碼:error_code=0
事件內(nèi)容:SET TIMESTAMP=1472608568/*!*/;
中繼日志:
從服務(wù)器上記錄下來從主服務(wù)器的二進(jìn)制日志文件同步過來的事件;
事務(wù)日志:
事務(wù)型存儲(chǔ)引擎innodb用于保證事務(wù)特性的日志文件:
redo log
undo log
主/從架構(gòu):
異步復(fù)制:
半同步復(fù)制:
一主多從;
一從一主;
級(jí)聯(lián)復(fù)制;
循環(huán)復(fù)制;
雙主復(fù)制;
一從多主:
每個(gè)主服務(wù)器提供不同的數(shù)據(jù)庫;
配置:
時(shí)間同步;
復(fù)制的開始位置:
從0開始;
從備份中恢復(fù)到從節(jié)點(diǎn)后啟動(dòng)的復(fù)制,復(fù)制的起始點(diǎn)備份操作時(shí)主節(jié)點(diǎn)所處的日志文件及其事件位置;
主從服務(wù)器mysqld程序版本不一致?
從的版本號(hào)高于主的版本號(hào);
主服務(wù)器:
配置文件my.cnf
server_id=#
log_bin=log-bin
啟動(dòng)服務(wù):
mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'USERNAME'@'HOST' IDENTIFIED BY 'YOUR_PASSWORD';
mysql> FLUSH PRIVILEGES;
從服務(wù)器:
配置文件my.cnf
server_id=#
relay_log=relay-log
read_only=ON
啟動(dòng)服務(wù):
mysql> CHANGE MASTER TO MASTER_HOST='HOST',MASTER_USER='USERNAME',MASTER_PASSWORD='YOUR_PASSWORD',MASTER_LOG_FILE='BINLOG',MASTER_LOG_POS=#;
mysql> START SLAVE [IO_THREAD|SQL_THREAD];
mysql> SHOW SLAVE STATUS;
課外作業(yè):基于SSL的復(fù)制的實(shí)現(xiàn);
主主復(fù)制:
互為主從:兩個(gè)節(jié)點(diǎn)各自都要開啟binlog和relay log;
1、數(shù)據(jù)不一致;
2、自動(dòng)增長id;
定義一個(gè)節(jié)點(diǎn)使用奇數(shù)id
auto_increment_offset=1
auto_increment_increment=2
另一個(gè)節(jié)點(diǎn)使用偶數(shù)id
auto_increment_offset=2
auto_increment_increment=2
配置:
1、server_id必須要使用不同值;
2、均啟用binlog和relay log;
3、存在自動(dòng)增長id的表,為了使得id不相沖突,需要定義其自動(dòng)增長方式;
服務(wù)啟動(dòng)后執(zhí)行如下兩步:
4、都授權(quán)有復(fù)制權(quán)限的用戶賬號(hào);
5、各把對(duì)方指定為主節(jié)點(diǎn);
復(fù)制時(shí)應(yīng)該注意的問題:
1、從服務(wù)設(shè)定為“只讀”;
在從服務(wù)器啟動(dòng)read_only,但僅對(duì)非SUPER權(quán)限的用戶有效;
阻止所有用戶:
mysql> FLUSH TABLES WITH READ LOCK;
2、盡量確保復(fù)制時(shí)的事務(wù)安全
在master節(jié)點(diǎn)啟用參數(shù):
sync_binlog = ON
如果用到的是InnoDB存儲(chǔ)引擎:
innodb_flush_logs_at_trx_commit=ON
innodb_support_xa=ON
3、從服務(wù)器意外中止時(shí)盡量避免自動(dòng)啟動(dòng)復(fù)制線程
4、從節(jié)點(diǎn):設(shè)置參數(shù)
sync_master_info=ON
sync_relay_log_info=ON
半同步復(fù)制
支持多種插件:/usr/lib64/mysql/plugins/
需要安裝方可使用:
mysql> INSTALL PLUGIN plugin_name SONAME 'shared_library_name';
半同步復(fù)制:
semisync_master.so
semisync_slave.so
主節(jié)點(diǎn):
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
+------------------------------------+-------+
| Variable_name? ? ? ? ? ? ? ? ? ? ? | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled? ? ? | OFF? |
| rpl_semi_sync_master_timeout? ? ? | 10000 |
| rpl_semi_sync_master_trace_level? | 32? ? |
| rpl_semi_sync_master_wait_no_slave | ON? ? |
+------------------------------------+-------+
MariaDB [mydb]> SET GLOBAL rpl_semi_sync_master_enabled=ON;
從節(jié)點(diǎn):
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';? ? ? ? ? ? ? ? ? ? ? ?
+---------------------------------+-------+
| Variable_name? ? ? ? ? ? ? ? ? | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled? ? | OFF? |
| rpl_semi_sync_slave_trace_level | 32? ? |
+---------------------------------+-------+
MariaDB [mydb]> STOP SLAVE IO_THREAD;
MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
MariaDB [mydb]> START SLAVE IO_THREAD;
判斷方法:
主節(jié)點(diǎn):
MariaDB [mydb]> SELECT @@global.rpl_semi_sync_master_clients;
復(fù)制過濾器:
僅復(fù)制有限一個(gè)或幾個(gè)數(shù)據(jù)庫相關(guān)的數(shù)據(jù),而非所有;由復(fù)制過濾器進(jìn)行;
有兩種實(shí)現(xiàn)思路:
(1) 主服務(wù)器
主服務(wù)器僅向二進(jìn)制日志中記錄有關(guān)特定數(shù)據(jù)庫相關(guān)的寫操作;
問題:其它庫的time-point recovery將無從實(shí)現(xiàn);
binlog_do_db=
binlog_ignore_db=
(2) 從服務(wù)器
從服務(wù)器的SQL THREAD僅重放關(guān)注的數(shù)據(jù)庫或表相關(guān)的事件,并將其應(yīng)用于本地;
問題:網(wǎng)絡(luò)IO和磁盤IO;
Replicate_Do_DB=
Replicate_Ignore_DB=
Replicate_Do_Table=
Replicate_Ignore_Table=
Replicate_Wild_Do_Table=
Replicate_Wild_Ignore_Table=
主從架構(gòu)
修改配置文件。
加入server-id。開啟二進(jìn)制日志

將二進(jìn)制日志目錄所有者更改為mysql

從節(jié)點(diǎn)修改配置文件,啟用中繼日志,將會(huì)把主節(jié)點(diǎn)二進(jìn)制日志復(fù)制過來
mkdir /data/mysql
[root@centos7 ~]# chown -R mysql.mysql /data/mysql/

MariaDB [(none)]> grant replication slave,replication client on *.* to 'repluser'@'192.168.1.%' identified by '123456'; #主節(jié)點(diǎn)創(chuàng)建復(fù)制賬號(hào)賦予復(fù)制權(quán)限
skip_name_resolve=ON #避免mysql將ip地址解析為主機(jī)名,這里可以跳過解析,在配置文件中加入此行
change master to master_host='192.168.1.196',master_port=3306,master_user='repluser',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=245;
在從節(jié)點(diǎn)配置連接信息。
master_host='192.168.1.196'#主節(jié)點(diǎn)主機(jī)。master_log_file='mysql-bin.000001'#指定從哪個(gè)二進(jìn)制文件開始復(fù)制,master_log_pos=245;#從二進(jìn)制文件中的哪個(gè)位置復(fù)制

start slave;備用節(jié)點(diǎn)開啟復(fù)制

查看同步狀態(tài)



主主復(fù)制:
互為主從:兩個(gè)節(jié)點(diǎn)各自都要開啟binlog和relay log;
1、數(shù)據(jù)不一致;
2、自動(dòng)增長id;
定義一個(gè)節(jié)點(diǎn)使用奇數(shù)id
auto_increment_offset=1
auto_increment_increment=2
另一個(gè)節(jié)點(diǎn)使用偶數(shù)id
auto_increment_offset=2
auto_increment_increment=2
配置:
1、server_id必須要使用不同值;
2、均啟用binlog和relay log;
3、存在自動(dòng)增長id的表,為了使得id不相沖突,需要定義其自動(dòng)增長方式;
服務(wù)啟動(dòng)后執(zhí)行如下兩步:
4、都授權(quán)有復(fù)制權(quán)限的用戶賬號(hào);
5、各把對(duì)方指定為主節(jié)點(diǎn);
復(fù)制時(shí)應(yīng)該注意的問題:
1、從服務(wù)設(shè)定為“只讀”;
在從服務(wù)器啟動(dòng)read_only,但僅對(duì)非SUPER權(quán)限的用戶有效;
阻止所有用戶:
mysql> FLUSH TABLES WITH READ LOCK;
2、盡量確保復(fù)制時(shí)的事務(wù)安全
在master節(jié)點(diǎn)啟用參數(shù):
sync_binlog = ON
如果用到的是InnoDB存儲(chǔ)引擎:
innodb_flush_logs_at_trx_commit=ON
innodb_support_xa=ON
3、從服務(wù)器意外中止時(shí)盡量避免自動(dòng)啟動(dòng)復(fù)制線程
4、從節(jié)點(diǎn):設(shè)置參數(shù)
sync_master_info=ON
sync_relay_log_info=ON
修改配置文件,啟用二進(jìn)制日志和中繼日志
serverid區(qū)別開來


GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO repluser@'192.168.1.%' IDENTIFIED BY '123456';
在兩邊節(jié)點(diǎn)都需要?jiǎng)?chuàng)建復(fù)制賬號(hào)
在復(fù)制時(shí)要指定對(duì)方當(dāng)前的二進(jìn)制日志記錄點(diǎn),
change MASTER TO MASTER_HOST='192.168.1.196',MASTER_USER='repluser',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=245;
change MASTER TO MASTER_HOST='192.168.1.198',MASTER_USER='repluser',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=418;


半同步復(fù)制
支持多種插件:/usr/lib64/mysql/plugins/
需要安裝方可使用:
mysql> INSTALL PLUGIN plugin_name SONAME 'shared_library_name';
半同步復(fù)制:
semisync_master.so
semisync_slave.so
主節(jié)點(diǎn):
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
+------------------------------------+-------+
| Variable_name? ? ? ? ? ? ? ? ? ? ? | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled? ? ? | OFF? |
| rpl_semi_sync_master_timeout? ? ? | 10000 |
| rpl_semi_sync_master_trace_level? | 32? ? |
| rpl_semi_sync_master_wait_no_slave | ON? ? |
+------------------------------------+-------+
MariaDB [mydb]> SET GLOBAL rpl_semi_sync_master_enabled=ON;
從節(jié)點(diǎn):
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';? ? ? ? ? ? ? ? ? ? ? ?
+---------------------------------+-------+
| Variable_name? ? ? ? ? ? ? ? ? | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled? ? | OFF? |
| rpl_semi_sync_slave_trace_level | 32? ? |
+---------------------------------+-------+
MariaDB [mydb]> STOP SLAVE IO_THREAD;
MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
MariaDB [mydb]> START SLAVE IO_THREAD;
判斷方法:
主節(jié)點(diǎn):
MariaDB [mydb]> SELECT @@global.rpl_semi_sync_master_clients;
復(fù)制過濾器:
僅復(fù)制有限一個(gè)或幾個(gè)數(shù)據(jù)庫相關(guān)的數(shù)據(jù),而非所有;由復(fù)制過濾器進(jìn)行;
有兩種實(shí)現(xiàn)思路:
(1) 主服務(wù)器
主服務(wù)器僅向二進(jìn)制日志中記錄有關(guān)特定數(shù)據(jù)庫相關(guān)的寫操作;
問題:其它庫的time-point recovery將無從實(shí)現(xiàn);
binlog_do_db=
binlog_ignore_db=
(2) 從服務(wù)器
從服務(wù)器的SQL THREAD僅重放關(guān)注的數(shù)據(jù)庫或表相關(guān)的事件,并將其應(yīng)用于本地;
問題:網(wǎng)絡(luò)IO和磁盤IO;
Replicate_Do_DB= #白名單
Replicate_Ignore_DB=#黑名單
Replicate_Do_Table= #表白名單
Replicate_Ignore_Table=#表黑名單
Replicate_Wild_Do_Table=#表通配符白名單
Replicate_Wild_Ignore_Table=
復(fù)制的監(jiān)控和維護(hù):
(1) 清理日志:PURGE
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr };
(2) 復(fù)制監(jiān)控
MASTER:
SHOW MASTER STATUS;
SHOW BINLOG EVENTS;
SHOW BINARY LOGS;
SLAVE:
SHOW SLAVE STATUS;
判斷從服務(wù)器是否落后于主服務(wù)器:
Seconds_Behind_Master: 0
(3) 如何確定主從節(jié)點(diǎn)數(shù)據(jù)是否一致?
通過表的CHECKSUM檢查;
使用percona-tools中pt-table-checksum;
(4) 主從數(shù)據(jù)不一致時(shí)的修復(fù)方法?
重新復(fù)制;
mysql 讀寫分離器
proxysql
vi /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name= ProxySQL YUM repository
baseurl=https://repo.proxysql.com/ProxySQL/proxysql-2.0.x/centos/latest
gpgcheck=1
gpgkey=https://repo.proxysql.com/ProxySQL/repo_pub_key
yum install proxysql
ProxySQL:
配置示例:
datadir="/var/lib/proxysql"
admin_variables=
{
admin_credentials="admin:admin"
mysql_ifaces="127.0.0.1:6032;/tmp/proxysql_admin.sock"
}
mysql_variables=
{
threads=4
max_connections=2048
default_query_delay=0
default_query_timeout=36000000
have_compress=true
poll_timeout=2000
interfaces="0.0.0.0:3306;/tmp/mysql.sock"
default_schema="information_schema"
stacksize=1048576
server_version="5.5.30"
connect_timeout_server=3000
monitor_history=600000
monitor_connect_interval=60000
monitor_ping_interval=10000
monitor_read_only_interval=1500
monitor_read_only_timeout=500
ping_interval_server=120000
ping_timeout_server=500
commands_stats=true
sessions_sort=true
connect_retries_on_failure=10
}
mysql_servers =
(
{
address = "172.18.0.67" # no default, required . If port is 0 , address is interpred as a Unix Socket Domain
port = 3306? ? ? ? ? # no default, required . If port is 0 , address is interpred as a Unix Socket Domain
hostgroup = 0? ? ? ? ? # no default, required
status = "ONLINE"? ? # default: ONLINE
weight = 1? ? ? ? ? ? # default: 1
compression = 0? ? ? # default: 0
},
{
address = "172.18.0.68"
port = 3306
hostgroup = 1
status = "ONLINE"? ? # default: ONLINE
weight = 1? ? ? ? ? ? # default: 1
compression = 0? ? ? # default: 0
},
{
address = "172.18.0.69"
port = 3306
hostgroup = 1
status = "ONLINE"? ? # default: ONLINE
weight = 1? ? ? ? ? ? # default: 1
compression = 0? ? ? # default: 0
}
)
mysql_users:
(
{
username = "root"
password = "mageedu"
default_hostgroup = 0
max_connections=1000
default_schema="mydb"
active = 1
}
)
mysql_query_rules:
(
)
scheduler=
(
)
mysql_replication_hostgroups=
(
{
writer_hostgroup=0
reader_hostgroup=1
}
)
2、搭建mysql服務(wù)器,并用mysqldump實(shí)現(xiàn)備份還原
備份工具:
mysqldump:mysql服務(wù)自帶的備份工具;邏輯備份工具;#將表查出來,轉(zhuǎn)換為insert語句,還原時(shí)在表插入數(shù)據(jù)
完全、部分備份;
InnoDB:熱備;
MyISAM:溫備;
cp/tar
lvm2:快照(請(qǐng)求一個(gè)全局鎖),之后立即釋放鎖,達(dá)到幾乎熱備的效果;物理備份;
注意:不能僅備份數(shù)據(jù)文件;要同時(shí)備份事務(wù)日志;
前提:要求數(shù)據(jù)文件和事務(wù)日志位于同一個(gè)邏輯卷;
xtrabackup:
由Percona提供,開源工具,支持對(duì)InnoDB做熱備,物理備份工具;
完全備份、部分備份;
完全備份、增量備份;
完全備份、差異備份;
mysqlhotcopy
select:
備份:SELECT cluase INTO OUTFILE 'FILENAME';
恢復(fù):CREATE TABLE
導(dǎo)入:LOAD DATA
mysqldump:
邏輯備份、完全備份、部分備份;
二次封裝工具:
mydumper
phpMyAdmin
Usage:
mysqldump [OPTIONS] database [tables]
OR? ? mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR? ? mysqldump [OPTIONS] --all-databases [OPTIONS]
mysqldump mydb:表級(jí)別備份
mysqldump --databases mydb:庫級(jí)別備份
MyISAM存儲(chǔ)引擎:支持溫備,備份時(shí)要鎖定表;
-x, --lock-all-tables:鎖定所有庫的所有表,讀鎖;
-l, --lock-tables:鎖定指定庫所有表;
InnoDB存儲(chǔ)引擎:支持溫備和熱備;
--single-transaction:創(chuàng)建一個(gè)事務(wù),基于此快照?qǐng)?zhí)行備份;
其它選項(xiàng):
-R, --routines:存儲(chǔ)過程和存儲(chǔ)函數(shù);
--triggers
-E, --events? ? ?
--master-data[=#]
1:記錄為CHANGE MASTER TO語句,此語句不被注釋;
2:記錄為CHANGE MASTER TO語句,此語句被注釋;
--flush-logs:鎖定表完成后,即進(jìn)行日志刷新操作;
mysqldump -uroot --all-databases -x -E --master-data=2 --flush-logs > /root/alldb-`date +%F`.sql
備份之后插入數(shù)據(jù)到表中

保存二進(jìn)制日志,刪庫


還原

查表

mysql -uroot < alldb-2019-09-29.sql
還原

3、使用xtrabackup實(shí)現(xiàn)完全備份,增量備份,并還原
使用Xtrabackup進(jìn)行MySQL備份:
一、安裝
1、簡介
Xtrabackup是由percona提供的mysql數(shù)據(jù)庫備份工具,據(jù)官方介紹,這也是世界上惟一一款開源的能夠?qū)nnodb和xtradb數(shù)據(jù)庫進(jìn)行熱備的工具。特點(diǎn):
(1)備份過程快速、可靠;
(2)備份過程不會(huì)打斷正在執(zhí)行的事務(wù);
(3)能夠基于壓縮等功能節(jié)約磁盤空間和流量;
(4)自動(dòng)實(shí)現(xiàn)備份檢驗(yàn);
(5)還原速度快;
2、安裝
其最新版的軟件可從 http://www.percona.com/software/percona-xtrabackup/ 獲得。本文基于RHEL5.8的系統(tǒng),因此,直接下載相應(yīng)版本的rpm包安裝即可,這里不再演示其過程。
二、備份的實(shí)現(xiàn)
1、完全備份
# innobackupex --user=DBUSER --password=DBUSERPASS? /path/to/BACKUP-DIR/
如果要使用一個(gè)最小權(quán)限的用戶進(jìn)行備份,則可基于如下命令創(chuàng)建此類用戶:
mysql> CREATE USER ’bkpuser’@’localhost’ IDENTIFIED BY ’s3cret’;
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM ’bkpuser’;
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO ’bkpuser’@’localhost’;
mysql> FLUSH PRIVILEGES;
使用innobakupex備份時(shí),其會(huì)調(diào)用xtrabackup備份所有的InnoDB表,復(fù)制所有關(guān)于表結(jié)構(gòu)定義的相關(guān)文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關(guān)文件,同時(shí)還會(huì)備份觸發(fā)器和數(shù)據(jù)庫配置信息相關(guān)的文件。這些文件會(huì)被保存至一個(gè)以時(shí)間命名的目錄中。

備份的目錄以當(dāng)前時(shí)間點(diǎn)為目錄名,二進(jìn)制日志記錄點(diǎn)為000003 pos為245,表示備份的節(jié)點(diǎn),以后可以基于這個(gè)節(jié)點(diǎn)往后利用二進(jìn)制日志還原

在備份的同時(shí),innobackupex還會(huì)在備份目錄中創(chuàng)建如下文件:
(1)xtrabackup_checkpoints —— 備份類型(如完全或增量)、備份狀態(tài)(如是否已經(jīng)為prepared狀態(tài))和LSN(日志序列號(hào))范圍信息;
每個(gè)InnoDB頁(通常為16k大小)都會(huì)包含一個(gè)日志序列號(hào),即LSN。LSN是整個(gè)數(shù)據(jù)庫系統(tǒng)的系統(tǒng)版本號(hào),每個(gè)頁面相關(guān)的LSN能夠表明此頁面最近是如何發(fā)生改變的。
(2)xtrabackup_binlog_info —— mysql服務(wù)器當(dāng)前正在使用的二進(jìn)制日志文件及至備份這一刻為止二進(jìn)制日志事件的位置。
(3)xtrabackup_binlog_pos_innodb —— 二進(jìn)制日志文件及用于InnoDB或XtraDB表的二進(jìn)制日志文件的當(dāng)前position。
(4)xtrabackup_binary —— 備份中用到的xtrabackup的可執(zhí)行文件;
(5)backup-my.cnf —— 備份命令用到的配置選項(xiàng)信息;
在使用innobackupex進(jìn)行備份時(shí),還可以使用--no-timestamp選項(xiàng)來阻止命令自動(dòng)創(chuàng)建一個(gè)以時(shí)間命名的目錄;如此一來,innobackupex命令將會(huì)創(chuàng)建一個(gè)BACKUP-DIR目錄來存儲(chǔ)備份數(shù)據(jù)。
2、準(zhǔn)備(prepare)一個(gè)完全備份
一般情況下,在備份完成后,數(shù)據(jù)尚且不能用于恢復(fù)操作,因?yàn)閭浞莸臄?shù)據(jù)中可能會(huì)包含尚未提交的事務(wù)或已經(jīng)提交但尚未同步至數(shù)據(jù)文件中的事務(wù)。因此,此時(shí)數(shù)據(jù)文件仍處理不一致狀態(tài)。“準(zhǔn)備”的主要作用正是通過回滾未提交的事務(wù)及同步已經(jīng)提交的事務(wù)至數(shù)據(jù)文件也使得數(shù)據(jù)文件處于一致性狀態(tài)。
innobakupex命令的--apply-log選項(xiàng)可用于實(shí)現(xiàn)上述功能。如下面的命令:
# innobackupex --apply-log? /path/to/BACKUP-DIR
如果執(zhí)行正確,其最后輸出的幾行信息通常如下:
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
120407? 9:01:36? InnoDB: Starting shutdown...
120407? 9:01:40? InnoDB: Shutdown completed; log sequence number 92036620
120407 09:01:40? innobackupex: completed OK!
在實(shí)現(xiàn)“準(zhǔn)備”的過程中,innobackupex通常還可以使用--use-memory選項(xiàng)來指定其可以使用的內(nèi)存的大小,默認(rèn)通常為100M。如果有足夠的內(nèi)存可用,可以多劃分一些內(nèi)存給prepare的過程,以提高其完成速度。
刪庫

innobackupex --apply-log . #對(duì)當(dāng)前目錄執(zhí)行指定應(yīng)用日志
一般情況下,在備份完成后,數(shù)據(jù)尚且不能用于恢復(fù)操作,因?yàn)閭浞莸臄?shù)據(jù)中可能會(huì)包含尚未提交的事務(wù)或已經(jīng)提交但尚未同步至數(shù)據(jù)文件中的事務(wù)。因此,此時(shí)數(shù)據(jù)文件仍處理不一致狀態(tài)。“準(zhǔn)備”的主要作用正是通過回滾未提交的事務(wù)及同步已經(jīng)提交的事務(wù)至數(shù)據(jù)文件也使得數(shù)據(jù)文件處于一致性狀態(tài)。
innobakupex命令的--apply-log選項(xiàng)可用于實(shí)現(xiàn)上述功能。如下面的命令:
# innobackupex --apply-log? /path/to/BACKUP-DIR
如果執(zhí)行正確,其最后輸出的幾行信息通常如下:
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
120407? 9:01:36? InnoDB: Starting shutdown...
120407? 9:01:40? InnoDB: Shutdown completed; log sequence number 92036620
120407 09:01:40? innobackupex: completed OK!
在實(shí)現(xiàn)“準(zhǔn)備”的過程中,innobackupex通常還可以使用--use-memory選項(xiàng)來指定其可以使用的內(nèi)存的大小,默認(rèn)通常為100M。如果有足夠的內(nèi)存可用,可以多劃分一些內(nèi)存給prepare的過程,以提高其完成速度。
3、從一個(gè)完全備份中恢復(fù)數(shù)據(jù)
注意:恢復(fù)不用啟動(dòng)MySQL
innobackupex命令的--copy-back選項(xiàng)用于執(zhí)行恢復(fù)操作,其通過復(fù)制所有數(shù)據(jù)相關(guān)的文件至mysql服務(wù)器DATADIR目錄中來執(zhí)行恢復(fù)過程。innobackupex通過backup-my.cnf來獲取DATADIR目錄的相關(guān)信息。
# innobackupex --copy-back? /path/to/BACKUP-DIR
如果執(zhí)行正確,其輸出信息的最后幾行通常如下:
innobackupex: Starting to copy InnoDB log files
innobackupex: in '/backup/2012-04-07_08-17-03'
innobackupex: back to original InnoDB log directory '/mydata/data'
innobackupex: Finished copying back files.
120407 09:36:10? innobackupex: completed OK!
innobackupex --copy-back /data/backup/2019-09-29_22-51-00/
當(dāng)數(shù)據(jù)恢復(fù)至DATADIR目錄以后,還需要確保所有數(shù)據(jù)文件的屬主和屬組均為正確的用戶,如mysql,否則,在啟動(dòng)mysqld之前還需要事先修改數(shù)據(jù)文件的屬主和屬組。如:
# chown -R? mysql:mysql? /mydata/data/
要實(shí)現(xiàn)第一次增量備份,可以使用下面的命令進(jìn)行:
# innobackupex --incremental /backup --incremental-basedir=BASEDIR
其中,BASEDIR指的是完全備份所在的目錄,此命令執(zhí)行結(jié)束后,innobackupex命令會(huì)在/backup目錄中創(chuàng)建一個(gè)新的以時(shí)間命名的目錄以存放所有的增量備份數(shù)據(jù)。另外,在執(zhí)行過增量備份之后再一次進(jìn)行增量備份時(shí),其--incremental-basedir應(yīng)該指向上一次的增量備份所在的目錄。
需要注意的是,增量備份僅能應(yīng)用于InnoDB或XtraDB表,對(duì)于MyISAM表而言,執(zhí)行增量備份時(shí)其實(shí)進(jìn)行的是完全備份。
“準(zhǔn)備”(prepare)增量備份與整理完全備份有著一些不同,尤其要注意的是:
(1)需要在每個(gè)備份(包括完全和各個(gè)增量備份)上,將已經(jīng)提交的事務(wù)進(jìn)行“重放”。“重放”之后,所有的備份數(shù)據(jù)將合并到完全備份上。
(2)基于所有的備份將未提交的事務(wù)進(jìn)行“回滾”。
于是,操作就變成了:
# innobackupex --apply-log --redo-only BASE-DIR
接著執(zhí)行:
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
而后是第二個(gè)增量:
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
innobackupex --copy-back ./
其中BASE-DIR指的是完全備份所在的目錄,而INCREMENTAL-DIR-1指的是第一次增量備份的目錄,INCREMENTAL-DIR-2指的是第二次增量備份的目錄,其它依次類推,即如果有多次增量備份,每一次都要執(zhí)行如上操作;
增量備份
innobackupex --incremental /data/backup/ --incremental-basedir=/data/backup2019-09-29_23-21-27
刪除表操作
MariaDB [mydb]> delete from tb1 where id=1;
增量備份完之后在刪除一次表,利用二進(jìn)制日志還原
delete from tb1 where id=2;
查看完全備份二進(jìn)制日志記錄點(diǎn)

將記錄點(diǎn)往后的記錄導(dǎo)出
mysqlbinlog -j 1178 /data/mysql/mysql-bin.000001 > /root/xtraback-binlog.sql
然后刪庫
[root@centos7 2019-09-29_23-21-27]$ innobackupex --apply-log --redo-only . #第一次提交
innobackupex --apply-log --redo-only . --incremental-dir=/data/backup/2019-09-29_23-33-16 #將增量備份也應(yīng)用至第一次的完備,然后合并日志
[root@centos7 2019-09-29_23-21-27]$innobackupex --copy-back ./ . #然后合并應(yīng)用日志
innobackupex --copy-back ./ #還原需要修改權(quán)限
set sql_log_bin=OFF; #關(guān)閉
source /tmp/xtraback-binlog.sql #在還原xtrabackup
4、搭建redis,并說明redis持久化原理
程序環(huán)境:
配置文件:/etc/redis.conf
主程序:/usr/bin/redis-server
6379/tcp
客戶端:/usr/bin/redis-cli
Unit File:/usr/lib/systemd/system/redis.service
數(shù)據(jù)目錄:/var/lib/redis
安裝:
$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz
$ tar xzf redis-5.0.5.tar.gz
$ cd redis-5.0.5
$ make
$ src/redis-server
$ src/redis-cli
redis> set foo barOK
redis> get foo"bar"

配置和使用Redis:
基本配置項(xiàng)
網(wǎng)絡(luò)配置項(xiàng)
持久化相關(guān)配置
復(fù)制相關(guān)的配置
安全相關(guān)配置
Limit相關(guān)的配置
SlowLog相關(guān)的配置
INCLUDES
Advanced配置
網(wǎng)絡(luò)配置項(xiàng):
bind IP
port PORT
protected-mode
tcp-backlog
unixsocket
timeout:連接的空閑超時(shí)時(shí)長;
安全配置:
requirepass <PASSWORD>
rename-command <COMMAND> <NEW_CMND_NAME>
在AOF或Replication環(huán)境中,不推薦使用;
Limits相關(guān)的配置:
maxclients
maxmemory <bytes>
maxmemory-policy noeviction
淘汰策略:volatile-lru, allkeys-lru, volatile-random, allkeys-random, volatile-ttl, noeviction
maxmemory-samples 5
淘汰算法運(yùn)行時(shí)的采樣樣本數(shù);
SlowLog相關(guān)的配置:
slowlog-log-slower-than 10000
單位是微秒;
slowlog-max-len 128
SlowLog記錄的日志最大條目;
Redis的持久化:
RDB:snapshotting, 二進(jìn)制格式;按事先定制的策略,周期性地將數(shù)據(jù)從內(nèi)存同步至磁盤;數(shù)據(jù)文件默認(rèn)為dump.rdb;
客戶端顯式使用SAVE或BGSAVE命令來手動(dòng)啟動(dòng)快照保存機(jī)制;
SAVE:同步,即在主線程中保存快照,此時(shí)會(huì)阻塞所有客戶端請(qǐng)求;
BGSAVE:異步;
AOF:Append Only File, fsync
記錄每次寫操作至指定的文件尾部實(shí)現(xiàn)的持久化;當(dāng)redis重啟時(shí),可通過重新執(zhí)行文件中的命令在內(nèi)存中重建出數(shù)據(jù)庫;
BGREWRITEAOF:AOF文件重寫;
不會(huì)讀取正在使用AOF文件,而是通過將內(nèi)存中的數(shù)據(jù)以命令的方式保存至臨時(shí)文件中,完成之后替換原來的AOF文件;
RDB相關(guān)的配置:
*save <seconds> <changes>
save 900 1
save 300 10?
save 60 10000?
表示:三個(gè)策略滿足其中任意一個(gè)均會(huì)觸發(fā)SNAPSHOTTING操作;900s內(nèi)至少有一個(gè)key有變化,300s內(nèi)至少有10個(gè)key有變化,60s內(nèi)至少有1W個(gè)key發(fā)生變化;
stop-writes-on-bgsave-error yes
dump操作出現(xiàn)錯(cuò)誤時(shí),是否禁止新的寫入操作請(qǐng)求;
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb:指定rdb文件名
*dir /var/lib/redis:rdb文件的存儲(chǔ)路徑
AOF相關(guān)的配置
*appendonly no
appendfilename "appendonly.aof"
*appendfsync
Redis supports three different modes:
no:redis不執(zhí)行主動(dòng)同步操作,而是OS進(jìn)行;
everysec:每秒一次;
always:每語句一次;
no-appendfsync-on-rewrite no
是否在后臺(tái)執(zhí)行aof重寫期間不調(diào)用fsync,默認(rèn)為no,表示調(diào)用;
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
上述兩個(gè)條件同時(shí)滿足時(shí),方會(huì)觸發(fā)重寫AOF;與上次aof文件大小相比,其增長量超過100%,且大小不少于64MB;
aof-load-truncated yes
注意:持久機(jī)制本身不能取代備份;應(yīng)該制訂備份策略,對(duì)redis庫定期備份;
RDB與AOF同時(shí)啟用:
(1) BGSAVE和BGREWRITEAOF不會(huì)同時(shí)進(jìn)行;
(2) Redis服務(wù)器啟動(dòng)時(shí)用持久化的數(shù)據(jù)文件恢復(fù)數(shù)據(jù),會(huì)優(yōu)先使用AOF;
5、搭建redis,并實(shí)現(xiàn)主從復(fù)制
復(fù)制:
特點(diǎn):
一個(gè)Master可以有多個(gè)slave主機(jī),支持鏈?zhǔn)綇?fù)制;
Master以非阻塞方式同步數(shù)據(jù)至slave主機(jī);
配置slave節(jié)點(diǎn):
redis-cli> SLAVEOF <MASTER_IP> <MASTER_PORT>
redis-cli> CONFIG SET masterauth <PASSWORD>
配置參數(shù):
*slaveof
*masterauth
slave-serve-stale-data yes
slave-read-only yes
*repl-diskless-sync no
no, Disk-backed, Diskless
新的從節(jié)點(diǎn)或某較長時(shí)間未能與主節(jié)點(diǎn)進(jìn)行同步的從節(jié)點(diǎn)重新與主節(jié)點(diǎn)通信,需要做“full synchronization",此時(shí)其同步方式有兩種style:
Disk-backend:主節(jié)點(diǎn)新創(chuàng)建快照文件于磁盤中,而后將其發(fā)送給從節(jié)點(diǎn);
Diskless:主節(jié)占新創(chuàng)建快照后直接通過網(wǎng)絡(luò)套接字文件發(fā)送給從節(jié)點(diǎn);為了實(shí)現(xiàn)并行復(fù)制,通常需要在復(fù)制啟動(dòng)前延遲一個(gè)時(shí)間段;
repl-diskless-sync-delay 5
repl-ping-slave-period 10
*repl-timeout 60
repl-disable-tcp-nodelay no
repl-backlog-size 1mb
*slave-priority 100
復(fù)制集群中,主節(jié)點(diǎn)故障時(shí),sentinel應(yīng)用場景中的主節(jié)點(diǎn)選舉時(shí)使用的優(yōu)先級(jí);數(shù)字越小優(yōu)先級(jí)越高,但0表示不參與選舉;
min-slaves-to-write 3:主節(jié)點(diǎn)僅允許其能夠通信的從節(jié)點(diǎn)數(shù)量大于等于此處的值時(shí)接受寫操作;
min-slaves-max-lag 10:從節(jié)點(diǎn)延遲時(shí)長超出此處指定的時(shí)長時(shí),主節(jié)點(diǎn)會(huì)拒絕寫入操作;
在從節(jié)點(diǎn)上修改配置文件,增加主節(jié)點(diǎn)ip端口,驗(yàn)證密碼




Server相關(guān)的命令:
CLIENT GETNAME
*CLIENT KILL
CLIENT KILL [ip:port] [ID client-id] [TYPE normal|master|slave|pubsub] [ADDR ip:port] [SKIPME yes/no]
*CLIENT LIST
CLIENT PAUSE
CLIENT PAUSE timeout
CLIENT REPLY
CLIENT SETNAME:Set the current connection name
? SHUTDOWN [NOSAVE|SAVE]
CONFIG GET #查詢配置文件中的配置段
CONFIG RESETSTAT?
CONFIG REWRITE #將命令行中保存的配置寫入配置文件
CONFIG SET #在命令行中修改配置文件中的配置
INFO:服務(wù)器狀態(tài)信息查看;分為多個(gè)secion;
INFO [section]
在命令行中直接配置從節(jié)點(diǎn)加入主節(jié)點(diǎn)復(fù)制
配置完成后,使用config rewrite 寫入配置文件完成永久有效

6、搭建redis集群
sentinel:https://redis.io/topics/sentinel?#官方文檔
主要完成三個(gè)功能:監(jiān)控、通知、自動(dòng)故障轉(zhuǎn)移
選舉:流言協(xié)議、投票協(xié)議
配置項(xiàng):
port 26379
sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel auth-pass <master-name> <password>
<quorum>表示sentinel集群的quorum機(jī)制,即至少有quorum個(gè)sentinel節(jié)點(diǎn)同時(shí)判定主節(jié)點(diǎn)故障時(shí),才認(rèn)為其真的故障;
s_down: subjectively down
o_down: objectively down
sentinel down-after-milliseconds <master-name> <milliseconds>
監(jiān)控到指定的集群的主節(jié)點(diǎn)異常狀態(tài)持續(xù)多久方才將標(biāo)記為“故障”;
sentinel parallel-syncs <master-name> <numslaves>
指在failover過程中,能夠被sentinel并行配置的從節(jié)點(diǎn)的數(shù)量;
sentinel failover-timeout <master-name> <milliseconds>
sentinel必須在此指定的時(shí)長內(nèi)完成故障轉(zhuǎn)移操作,否則,將視為故障轉(zhuǎn)移操作失敗;
sentinel notification-script <master-name> <script-path>
通知腳本,此腳本被自動(dòng)傳遞多個(gè)參數(shù);
redis-cli -h SENTINEL_HOST -p SENTINEL_PORT
redis-cli>
SENTINEL masters
SENTINEL slaves <MASTER_NAME>
SENTINEL failover <MASTER_NAME>
SENTINEL get-master-addr-by-name <MASTER_NAME>
vim /etc/redis-sentinel.conf? #修改配置文件
port 26379
bind 0.0.0.0
sentinel monitor mymaster 192.168.1.196 6379 2 #添加監(jiān)控主節(jié)點(diǎn)ip及端口,以及投票權(quán)重
sentinel auth-pass mymaster 123456 #密碼
sentinel down-after-milliseconds mymaster 5000 #超時(shí)時(shí)長
sentinel parallel-syncs mymaster 1 #幾路并發(fā)時(shí)間
sentinel failover-timeout mymaster 180000 #sentinel必須在此指定的時(shí)長內(nèi)完成故障轉(zhuǎn)移操作,否則,將視為故障轉(zhuǎn)移操作失??;
復(fù)制至其他節(jié)點(diǎn)。
systemctl start redis-sentinel #在其他節(jié)點(diǎn)啟動(dòng)sentinel服務(wù)即可
會(huì)自動(dòng)記錄主從節(jié)點(diǎn)

redis cluster
修改配置文件。
vim /etc/redis.conf
cluster-enabled yes #啟用集群
cluster-config-file cluster.conf #集群配置文件
cluster-node-timeout 15000 #超時(shí)時(shí)長
cluster-slave-validity-factor 10 #主從判斷因子
將配置文件復(fù)制至其他集群節(jié)點(diǎn)
rm -rf /var/lib/redis/dump.rdb #這里我刪除之前配置的數(shù)據(jù)。
redis-cli -a 123456 -c cluster addslots {0..5500}?
啟動(dòng)redis后為每個(gè)節(jié)點(diǎn)分配slots; cluster addslots
每個(gè)slot要獨(dú)立創(chuàng)建,可用范圍為0-16383,共16384個(gè);
redis-cli -h 192.168.1.198 -a 123456 -c cluster addslots {5501..11000}
redis-cli -h 192.168.1.202 -a 123456 -c cluster addslots {11001..16385}
設(shè)定集群成員關(guān)系;cluster meet

cluster info;
集群建立成功后每個(gè)slots都為16384
