主讀之間是讀寫分離的系統。
主備數據之間通過binlog同步數據庫數據。
主讀字節,通過binlog同步數據。
讀備數據庫, 通過binlog同步數據。
keepalived用來保證主備數據庫之間實現高可用 。
我們通過這種方法實現,讀寫分離和高可用方案。
數據庫之間binlog的同步配置,mysql配置文件
[client]
port=3306
default-character-set=utf8mb4
#MySQLscokt文件配置
socket=/mysqldata/mysql3306/mysql.sock
[mysql]
port=3306
default-character-set=utf8mb4
[mysqld]
user=mysql
prot=3306
basedir=/mysqldata
lc_message_dir=/usr/shara/mysql
datadir=/mysqldata/mysql3306/data
tmpdir=/mysqldata/msyql3306/tmp
socket=/mysqldata/mysql3306/mysql.sock
pid_file=/msyqldata/mysql3306/mysql.pid
symbolic_links=0
explicit_default_for_timestamp=0
skip_external_locking=1
skip_ssl=1
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_AUTO_VALUE_ON_ZERO
#字符集
character_set_server=uft8mb4
collation_server=utf8mb4_bin
init_connect='SET NAMES utf8mb4'
#表名字段忽略大小寫
lower_case_table_names=1
#開啓event 功能,備庫建議關閉
event_scheduler=1
##連接相關參數###
#默認最大連接16384
max_connections=2000
#阻止過多嘗試失敗的客戶端連接
max_connections_errors=50
#服務器等待連接的時間 mysql-error 中經常出現 "Lost connection to mysql server at 'XXX', system error:errno"可以適當增加該值
connect_timeout=10
#等待客戶端響應超時 默認28800
wait_timeout=1800
#打開文件數
open_files_limit=65535
##內存緩存相關參數##
#限制server接受的數據包大小
max_allowed_packet=64M
#msyql讀入緩存大小
read_buffer_size=1M
#開啓隨機讀緩衝區#
read_rnd_buffer_size=5M
##線程緩衝池##
thread_cache_size=64
###每個線程分配的內存大小#
thread_stack=262144
#指定分配緩衝區空間的最小單位
query_cache_min_res_unit=1K
##開啓查詢緩存 0(OFF),1(ON)和2(DEMAND) ##
query_cache_type=1;
#查詢緩存大小##
query_cache_size=64M
##指定單個查詢能夠使用的緩衝區大小##
query_cache_limit=1M
##限制緩存表的最大數目##
table_open_cache=512
##需要排序的緩存大小#
sort_buffer_size=256K
##內存臨時表大小##
tmp_table_size=64M
##可以創建的內存表大小 不小於tmp_table_size#
max_heap_table_size=64M
###日誌相關參數####
###錯誤日誌##
log_error=/mysqllog/mysql3306/log/mysqld.log
###二進制日誌###
log_bin=/mysqllog/mysql3306/binlog/mysql-bin
server-id=1
###二進制日誌自動刪除/過期天數##
expire_logs_days=7
sync_binlog=1
###單個二進制日誌自動刪除/過期天數###
max_binlog_size=100M
##binlog能夠使用的最大cache大小##
max_binlog_cache_size=200M
##慢日誌###
log_queries_not_using_indexes=0
slow_query_log=1
slow_query_log_file=/msyqllog/mysql3306/log/mysql-show.log
##記錄超過多少秒的SQL語句#
long_query_time=1
###日誌時間跟隨系統時間##
log_timestamps=SYSTEM
##binlog_format##
binlog_format=row
##遭遇故障,暫停日誌寫入,並關閉數據庫
binlog_error_action=ABORT_SERER
######INNODB 相關參數#########
default_storage_engine=InnoDB
disabled_storage_engines=ARCHIVE,BLACKHOLE,EXAMPLE,FEDERATED,MEMORY,MERGE,NDB
##開啓innodb爲獨立空間模式
innodb_file_per_table=1
##redo log 數量#
innodb_log_files_in_group=2
##innodb 中讀寫操作的IO線程數,默認爲4
innodb_write_io_threads=8
innodb_read_io_threads=8
##打開死鎖監控
innodb_print_all_deadlocks=1
#嚴格模式
innodb_strict_mode=1
innodb_sort_buffer_size=8M
innodb_stats_persistent_sample_pages=64
innodb_autoinc_lock_mode=2
innodb_online_alter_log_max_size=1G
innodb_open_file=4096
innodb_temp_data_file_path=ibtmp1:12M:autoextend:max:20G
##Undo log config
innodb_rollback_segments=128
innodb_undo_log_truncate=1
innodb_max_undo_log_size=4G
#指定INNODB 一次可以保持打開的.idb文件最大數量
innodb_open_files=60000
##設置提交事務時日誌緩衝寫入日誌文件,對日誌入磁盤
innodb_flush_log_at_trx_commit=1
#存儲數據庫結構和其他內部數據結構的內存池
innodb_additional_mem_pool_size=16M
#鎖超時時間設置秒
innodb_lock_wait_timeout=50
#日誌緩存 默認1MB 通常設置8~16
innodb_log_buffer_size=16M
#每個日誌文件大小
innodb_log_file_size=128M
innodb_log_group_home_dir=/mysqldata/mysql3306/data
inodb_data_file_path=ibdata1:128M:autoextend
innodb_autoextend_increment=16
##從庫記錄binlog ,主從設置
log_slave_updates=1
relay_log_recovery=1
relay_log=/mysqllog/mysql3306/relaylog/mysql-relay
##replicate-wild-ignore-table=performance_schema.%
master-info-repository=TABLE
relay-log-info-repository=TABLE
##並行複製
slave-parallel-type=LOGICAL_CLOCK
##複製工作線程數量,如果主庫業務併發大 可以調整
slave_parallel_workers=16
##從庫並行回放時,保證提交順序與relay log中事務順序相同
slave_preserve_commit_order=ON
slave_rows_search_algorithms='INDEX_SCAN,HASH_SCAN'
gtid_mode =ON
enforece_gtid_consistency=1
binlog_gtid_simple_recovery=1
主要關注
關鍵性配置:
server-id = 1 #MySQL服務器標誌,必須唯一
log-bin=mysql-bin #二進制日誌文件的位置和命名
log-slave-updates=1 #事件自動更新到日誌中
sync_binlog=1 #日誌文件同步到磁盤上
replicate_do_db=test #要同步的數據庫名稱
有關MySQL通過binlog同步的幾種組合方式可以參考:https://blog.csdn.net/u010253004/article/details/82316619
重啓服務:
systemctl restart mysqld
查找密碼
grep password /mysqldata/mysql3306/log/mysqld.log
mysql -uroot -p
set password for root@localhost=password('password');
flush privileges;
#創建同步用戶
GRANT replication slave on *.* to 'sql_back' ;
設置權限
GRANT replication slave on *.* to 'sql_backup'@'%' identified by 'passwd' ;
配置同步
主
change master to
master_port=3306,
master_host='IP',
master_user='sql_backup',
master_password='passwd',
master_log_file='mysql-bin.000002',
master_log_pos='2301';
start slave;
備
change master to
master_port=3306,
master_host='IP',
master_user='sql_backup',
master_password='passwd',
master_log_file='mysql-bin.000002',
master_log_pos='3106',
start slave;
從
change master to
master_port=3306,
master_host='IP',
master_user='sql_backup',
master_password='passwd',
master_log_file='mysql-bin.000002',
master_log_pos='3106',
change master to
master_port=3306,
master_host='IP',
master_user='sql_backup',
master_password='passwd',
master_log_file='mysql-bin.000002',
master_log_pos='2301',
start slave;
查看同步是否正確執行
show slave status \G;
keepaliev
keepalived是一個類似於layer3, 4 &7交換機制的軟件,也就是我們平時說的第3層、第4層和第7層交換。Keepalived是自動完成,不需人工干涉。
Keepalived軟件主要是通過VRRP協議實現高可用功能的。VRRP是Virtual Router
RedundancyProtocol(虛擬路由器冗餘協議)的縮寫,VRRP出現的目的就是爲了解決靜態路由單點故障問題的,它能夠保證當個別節點宕機時,整個網絡可以不間斷地運行。
Keepalived使用虛擬IP實現雙機熱備解決方案。
建議使用yum安裝 源碼安裝有太多依賴包的問題
!Configuration File for keepalied
global_defs {
router_id promaster01 #唯一ID
}
vrrp_script check_mysql {
script"執行的腳本 如 /bin/stat.sh "
interval 5 #腳本執行間隔
weight -20 #檢測後優先級增量
}
vrrp_instance V1_HA {
state MASTER
interface eth0 #網卡
virtual_router_id 70 #組ID 同組相同
priority 100 #優先級 主大於備
adver_int 2 #vrrp通告間隔時間
nopreempt #不搶佔模式
authentication {
auth_type PASS #通訊協議
auth_pass 1111
}
unicat_src_ip #ip 爲本節點
unicat_peer{
ip#通知的節點IP
}
#檢測腳本
track_script {
check_msyql
}
virtual_ipaddress{
虛IP
}
}
其他配置可以模仿它寫
keepalive詳解 推薦參考文章:https://blog.csdn.net/WanJiaBaoBao/article/details/83622621