Centos 7 - MariaDB with Galera Cluster

環境說明:

HostInterface(enp0s3)
galera1192.168.100.6
galera2192.168.100.7
galera3192.168.100.8

首先,先修改三台host的hostname分別為galera1、galera2、galera3
$ sudo vim /etc/hostname galera1

接著修改三台的hosts,把三台host都新增至hosts裡
$ sudo vim /etc/hosts 192.168.100.6 galera1 192.168.100.7 galera2 192.168.100.8 galera3

修改selinux,修改以下項目,將 enforcing 修改成 permissive
$ sudo vim /etc/selinux/config
SELinux=permissive

更新repository,並重新啟動
$ sudo yum update -y && reboot

安裝mariadb跟galera,我們這邊是安裝mariadb 10的版本,所以須先加入repository
$ sudo vim /etc/yum.repos.d/MariaDB.repo

# 新增以下內容:

[mariadb]

name=MariaDB

baseurl=http://yum.mariadb.org/10.0/centos7-amd64

gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

gpgcheck=1



$ sudo yum install MariaDB-Galera-server MariaDB-client galera

啟動mysql service,並設定使用者權限
$ sudo systemctl start mysql.service

$ mysql_secure_installation

$ sudo mysql_secure_installation 
Enter current password for root (enter for none): #第一次設定沒有密碼,所以直接按 Enter 即可
Set root password? [Y/n] y #是否設定新的 root 密碼?
Remove anonymous users? [Y/n] y #是否移除匿名使用者的資料?
Disallow root login remotely? [Y/n] y #設定是否讓 root 只能從本機登入?
Remove test database and access to it? [Y/n] y #是否移除測試資料庫?

Reload privilege tables now? [Y/n] y #是否要重新載入tables的權限資訊?

# 建立一個cluster的使用者並設定權限
$ mysql -u root -ppassword -e "GRANT ALL PRIVILEGES ON *.* TO 'cluster'@'localhost' IDENTIFIED BY 'password';"

$ mysql -u root -ppassword -e "GRANT ALL PRIVILEGES ON *.* TO 'cluster'@'%' IDENTIFIED BY 'password';"
在iptables上設定galera所需要port
# MySQL 客戶端連線使用 3306 port
$ sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent

# Galera cluster node之間資料複製使用 4567 port
$ sudo firewall-cmd --zone=public --add-port=4567/tcp --permanent

# 同步增量資料使用 4568 port
$ sudo firewall-cmd --zone=public --add-port=4568/tcp --permanent

# 第一次加入 Galera cluster 後完整同步資料使用 4444 port

$ sudo firewall-cmd --zone=public --add-port=4444/tcp --permanent



$ sudo firewall-cmd --reload


$ sudo firewall-cmd --list-all
public (default, active)
  interfaces: enp0s3
  sources:
  services: dhcpv6-client ssh
  ports: 3306/tcp 4567/tcp 4568/tcp 4444/tcp
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
===============================分隔線=========================== sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent sudo firewall-cmd --zone=public --add-port=4567/tcp --permanent sudo firewall-cmd --zone=public --add-port=4568/tcp --permanent sudo firewall-cmd --zone=public --add-port=4444/tcp --permanent sudo firewall-cmd --reload

設定mariadb與galera
$ sudo systemctl stop mysql.service

$ sudo mkdir -p /var/log/mysql

$ vim /etc/my.cnf.d/galera.cnf
[mysqld]
# 因為 Galera 使用 RBR format 建立 writesets,
# 因此必須設定為 row-level
binlog_format=ROW

# Galera cluster 僅能使用 InnoDB
default-storage-engine=innodb

# auto-increment 必須設定為 interleaved lock mode(2),
# 設定其他 mode(0 or 1) 可能會在 insert 資料的時候造成 deadlock
innodb_autoinc_lock_mode=2

innodb_locks_unsafe_for_binlog=1
# 關閉 query cache 功能
query_cache_size=0
query_cache_type=0
bind-address=0.0.0.0
datadir=/var/lib/mysql
# 每個 log file 所儲存的 size 大小,最大儲存 size 不超過 100MB
innodb_log_file_size=100MB

innodb_file_per_table=1
innodb_flush_log_at_trx_commit=2

# 預設為 128MB,保留 5% 給 Galera cluster 使用(若設定太大,
# 會導致 mysql 服務無法法啟動)
innodb_buffer_pool_size=122MB

# 為資料庫最大連線數量,可依最大連線數量調整
max_connections=10000

innodb_buffer_pool_instances=8
innodb_log_buffer_size=8MB

# 為有多少的 thread 數可以被同時執行,可依 CPU 核心數量設定
thread_pool_size=24

# 為能允許最多的 thread 數量,當 thread 超過這個數量,
# 就不會產生新的 thread
thread_pool_max_threads=65536

# 可以被重複使用的 thread server cache 數量。
# 如果數值還沒達到上限,當一個 client 結束連線,
# 這個 thread 會被放入 cache,之後同樣的 thread 就可以被重複使用
thread_cache_size=4096
thread_handling=pool-of-threads

wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name='galera_cluster'
# 請輸入galera1-3的ip
# ex:gcomm://192.168.100.6,192.168.100.7,192.168.100.8
wsrep_cluster_address='gcomm://galera1_ip,galera2_ip,galera3_ip'

# 分別輸入每一台的ip
wsrep_node_address='galera1_ip'

# 分別輸入每一台的hostname
wsrep_node_name='galera1'
wsrep_sst_method=rsync

# 輸入剛剛所新增的cluster使用者以及密碼
wsrep_sst_auth=cluster:password

log_error=/var/log/mysql/mysql_error.log
===============================分隔線===========================
[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1
query_cache_size=0
query_cache_type=0
bind-address=0.0.0.0
datadir=/var/lib/mysql
innodb_log_file_size=100MB
innodb_file_per_table=1
innodb_flush_log_at_trx_commit=2
innodb_buffer_pool_size=122MB
max_connections=10000
innodb_buffer_pool_instances=8
innodb_log_buffer_size=8MB
thread_pool_size=24
thread_pool_max_threads=65536
thread_cache_size=4096
thread_handling=pool-of-threads

wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name='galera_cluster'
wsrep_cluster_address='gcomm://192.168.100.6,192.168.100.7,192.168.100.8'
wsrep_node_address='192.168.100.8'
wsrep_node_name='galera3'
wsrep_sst_method=rsync
wsrep_sst_auth=cluster:password
log_error=/var/log/mysql/mysql_error.log


啟動galera,並驗證是否正常
# 首先,先在galera1啟動,輸入以下cmd
$ sudo /etc/init.d/mysql start --wsrep-new-cluster

# 接著在其他兩台輸入
$ sudo systemctl start mysql.service

# 檢查 galera1, galera2, galera3 的 Galera 服務是否啟動
$ sudo mysql -uroot -p -e "show status like 'wsrep%'"

+------------------------------+----------------------------------------------------------------+ | Variable_name | Value | +------------------------------+----------------------------------------------------------------+ | wsrep_local_state_comment | Synced | | wsrep_incoming_addresses | 192.168.100.6:3306,192.168.100.7:3306,192.168.100.8:3306 | | wsrep_cluster_size | 3 | | wsrep_cluster_status | Primary | | wsrep_connected | ON | | wsrep_ready | ON | | ........... | .............. | +------------------------------+----------------------------------------------------------------+


==Note==

如果今天想新增或是刪除galera的機器的話,勢必要到每一台galera機器上修改conf然後重啟。,這會比較耗時,
所以可以直接利用mysql cmd去做設定
# 先顯示目前可連線的機器ip
$ mysql -e "SHOW VARIABLES LIKE 'wsrep_cluster_address';"
+-----------------------+-------------------------------------+
| Variable_name         | Value                   |
+-----------------------+-------------------------------------+
| wsrep_cluster_address | gcomm://192.168.100.6,192.168.100.7,192.168.100.8|

+-----------------------+-------------------------------------+

# 在輸入以下cmd去新增或是刪除可連線的機器
$ mysql -uroot -ppassword -e "SET GLOBAL wsrep_cluster_address='gcomm://192.168.100.6,192.168.100.7';"
另外需要注意的是,由於每一台galera機器都互相設定可連線的ip,因此如果要關閉全部 galera機器的話,請務必v修改conf將第一台重新設定 gcomm:// 為空值。

參考來源:
Galera Cluster for MySQL Multi-master Replication

[Cluster] 在 Ubuntu 上安裝 MariaDB Galera Cluster

留言

這個網誌中的熱門文章

devstack安裝all in one openstack(pike)

Python - 計算特定目錄底下的檔案以及目錄數量

利用ATOM 編輯器在Windows開發PHP