1. 程式人生 > >生產環境實踐Mysql5.7主從+Atlas實現讀寫分離

生產環境實踐Mysql5.7主從+Atlas實現讀寫分離

pro c-c creators 日誌 可執行 公眾 var timeout 錯誤信息

技術分享圖片
技術分享圖片

Mysql主從搭建

主從復制可以使MySQL數據庫主服務器的主數據庫,復制到一個或多個MySQL從服務器從數據庫,默認情況下,復制異步; 根據配置,可以復制數據庫中的所有數據庫,選定的數據庫或甚至選定的表。
MySQL的工作方式是單進程多線程的方式,那麽線程的多寡則會極大的影響到MySQL的效率,而在早期MySQL的主從都是由單線程進行的,使得主從復制除了相關的客觀因素外還受到自身的影響;為此在MySQL的5.7版本中對多線程主從復制來進一步的改善,在MySQL 5.7中是按照邏輯時鐘(類似CPU的處理機制)來處理多線程,甚至在半同步復制semisync中還是使用Performance Schema表來監控復制線程;

先卸載系統自帶的mariadb數據庫

     yum -y remove mariadb*

Yum安裝Percona

     wget https://www.percona.com/downloads/Percona-Server-LATEST/Percona-Server-5.7.22-22/binary/redhat/7/x86_64/Percona-Server-server-57-5.7.22-22.1.el7.x86_64.rpm
     yum install -y  Percona-Server-server-57-5.7.22-22.1.el7.x86_64.rpm

192.168.253.188(主庫)配置文件

[client]
default_character_set = utf8mb4
socket=/var/lib/mysql/mysql.sock

[mysqld]
port=3306
socket=/var/lib/mysql/mysql.sock
basedir = /data/local/percona5.7.22
datadir = /data/local/percona5.7.22/data
pid_file = /var/lib/mysql/mysql-pid.pid
character_set_server = utf8mb4
default_storage_engine = InnoDB
explicit_defaults_for_timestamp
federated
skip-name-resolve
gtid-mode = ON
enforce-gtid-consistency = ON
log-slave-updates = ON

#Innodb
innodb_flush_method = O_DIRECT
innodb_log_files_in_group = 2
innodb_lock_wait_timeout = 100
innodb_log_file_size = 1024M
innodb_flush_log_at_trx_commit = 1
innodb_file_per_table = 1
innodb_thread_concurrency = 8
innodb_buffer_pool_size = 5G
innodb_read_io_threads = 24
innodb_write_io_threads = 24
log_bin_trust_function_creators=1
innodb_page_cleaners=8
innodb_lru_scan_depth=256

innodb_locks_unsafe_for_binlog = 1
innodb_autoinc_lock_mode = 2
sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
group_concat_max_len = 18446744073709551615

# MyISAM #
key_buffer_size = 1344M
myisam_recover_options = FORCE,BACKUP
lower_case_table_names=1
event_scheduler=1

# SAFETY #
max_allowed_packet = 1024M
max_connect_errors = 1000000
skip_name_resolve = 1

# Binary Logging #
server_id = 200
log_bin = mysql-bin
binlog_format = ROW
sync_binlog = 1

# CACHES AND LIMITS #
tmp_table_size = 32M
max_heap_table_size = 32M
max_connections = 1000
thread_cache_size = 50
open_files_limit = 65535
table_definition_cache = 4096
table_open_cache = 5000

# LOGGING #
log_error = /data/logs/mysql/mysql-error.log
log_queries_not_using_indexes = 0
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /data/logs/mysql/mysql-slow.log

# REPLICATION #
relay_log = relay-bin
slave_net_timeout = 60
symbolic-links = 0
transaction_isolation = READ-COMMITTED 

[mysql]
no-auto-rehash
default_character_set = utf8mb4

[xtrabackup]
default-character-set = utf8mb4

192.168.253.189(從庫,190從庫也是一樣配置)配置文件

     [client]
default_character_set = utf8mb4
socket=/var/lib/mysql/mysql.sock

[mysqld]
port=3306
socket=/var/lib/mysql/mysql.sock
basedir = /data/local/percona5.7.22
datadir = /data/local/percona5.7.22/data
pid_file = /var/lib/mysql/mysql-pid.pid
character_set_server = utf8mb4
default_storage_engine = InnoDB
explicit_defaults_for_timestamp
federated
skip-name-resolve
gtid-mode = ON
enforce-gtid-consistency = ON
log-slave-updates = ON
slave_type_conversions="ALL_NON_LOSSY"

#Innodb
innodb_flush_method = O_DIRECT
innodb_log_files_in_group = 2
innodb_lock_wait_timeout = 100
innodb_log_file_size = 1024M
innodb_flush_log_at_trx_commit = 1
innodb_file_per_table = 1
innodb_thread_concurrency = 8
innodb_buffer_pool_size = 5G
innodb_read_io_threads = 24
innodb_write_io_threads = 24
log_bin_trust_function_creators=1
innodb_page_cleaners=4
innodb_lru_scan_depth=256
innodb_buffer_pool_instances=2

innodb_locks_unsafe_for_binlog = 1
innodb_autoinc_lock_mode = 2
sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
group_concat_max_len = 18446744073709551615

# MyISAM #
key_buffer_size = 1344M
myisam_recover_options = FORCE,BACKUP
lower_case_table_names=1
event_scheduler=1
slave_pending_jobs_size_max = 1344M

# SAFETY #
max_allowed_packet = 512M
max_connect_errors = 1000000
skip_name_resolve = 1
slave-skip-errors=1007,1008,1032,1062

# Binary Logging #
server_id = 201
log_bin = mysql-bin
binlog_format = ROW
sync_binlog = 1

# CACHES AND LIMITS #
tmp_table_size = 32M
max_heap_table_size = 32M
max_connections = 1000
thread_cache_size = 50
open_files_limit = 65535
table_definition_cache = 4096
table_open_cache = 5000

# LOGGING #
log_error = /data/logs/mysql/mysql-error.log
log_queries_not_using_indexes = 0
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /data/logs/mysql/mysql-slow.log

# REPLICATION #
relay_log = relay-bin
slave_net_timeout = 60
symbolic-links = 0

# slave
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON

[mysql]
no-auto-rehash
default_character_set = utf8mb4

[xtrabackup]
default-character-set = utf8mb4

server_id三臺數據庫要設置成不同

啟動mysql

systemctl start mysql.service

查詢初始化密碼

grep "password" /var/log/mysqld.log     

修改root密碼

ALTER USER ‘root‘@‘localhost‘ IDENTIFIED BY ‘new_password‘;

使用Atlas實現讀寫分離
環境安裝
yum -y install libevent glib2 lua gcc gcc-c++ autoconf mysql-devel libtool pkgconfig ncurses ncurses-devel libevent-devel

下載Atlas包

wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm

安裝atlas

yum install Atlas-2.2.1.el6.x86_64.rpm -y
#ll /usr/local/mysql-proxy/
total 4
-rw-r--r-- 1 root root 402 Sep 11 14:59 drwxr-xr-x 2 root root  75 Sep 10 14:24 bin
drwxr-xr-x 2 root root  22 Sep 11 14:59 conf
drwxr-xr-x 3 root root 331 Sep 10 14:14 lib
drwxr-xr-x 2 root root  58 Sep 11 14:59 log

bin目錄下放的都是可執行文件

  1. “encrypt”是用來生成MySQL密碼加密的,在配置的時候會用到
  2. “mysql-proxy”是MySQL自己的讀寫分離代理
  3. “mysql-proxyd”是360弄出來的,後面有個“d”,服務的啟動、重啟、停止。都是用他來執行的
  4. conf目錄下放的是配置文件

“test.cnf”只有一個文件,用來配置代理的,可以使用vim來編輯
lib目錄下放的是一些包,以及Atlas的依賴
log目錄下放的是日誌,如報錯等錯誤信息的記錄
使用encrypt來對數據庫的密碼進行加密,賬號:aadminproxy,密碼:123456

/usr/local/mysql-proxy/bin/encrypt 123456
XXfVpJOzMdITLHv26rAgv

配置atlas

vim /usr/local/mysql-proxy/conf/test.cnf
[mysql-proxy]
admin-username = root
admin-password = admin123
proxy-backend-addresses = 192.168.253.188:3306
proxy-read-only-backend-addresses = 192.168.253.189:3306@1,192.168.253.190:3306@2
pwds = aadminproxy:XXfVpJOzMdITLHv26rAgv
daemon = true
keepalive = true
event-threads = 8
log-level = message
log-path = /usr/local/mysql-proxy/log
sql-log=ON
proxy-address = 0.0.0.0:8066
admin-address = 0.0.0.0:2345
charset=utf8

啟動

/usr/local/mysql-proxy/bin/mysql-proxyd test start 

更新有趣IT資訊,幹貨,關註下面公眾號吧,互聯網愛好者必備公眾號
技術分享圖片

生產環境實踐Mysql5.7主從+Atlas實現讀寫分離