├── Galera_on_CentOS ├── README.md └── scripts │ ├── README.md │ ├── backup │ ├── README.md │ ├── conf.cfg │ └── galera.bash │ ├── galera-3-node.sh │ └── var.cfg ├── Galera_on_Ubuntu ├── README.md └── scripts │ ├── README.md │ ├── galera-u.bash │ └── var.cfg ├── HA-cho-MariaDB-tren-CentOS7 ├── README.md ├── db-cent7.bash └── var.conf ├── README.md ├── db-cent7-2.bash ├── docs ├── 1-install-mysql-community-from-repository.md ├── 2-replica-master-slave.md ├── backup-mysql-to-minio-s3.md └── gtid-notes.md └── drafts ├── GALERA-setup-ubuntu.bash ├── Hadoop-v1.mmap ├── NNSv1.mmap ├── NNSv2.mmap ├── NNSv3.mmap ├── README-1.md ├── ghichepdb.md └── setup-centos-full.bash /Galera_on_CentOS/README.md: -------------------------------------------------------------------------------- 1 | ## Hướng dẫn cài đặt Galera cho MariaDB trên CentOS 7 2 | 3 | ### Menu 4 | 5 | [1. Chuẩn bị ](#1) 6 | 7 | - [1.1. Môi trường cài đặt](#1.1) 8 | - [1.2. Thiết lập IP cho các node](#1.2) 9 | - [1.3. Mô hình](#1.3) 10 | 11 | [2. Các bước tiến hành](#2) 12 | 13 | - [2.1 Cài đặt MariaDB trên các node](#2.1) 14 | - [2.2 Cài đặt Galera cho MariaDB](#2.2) 15 | - [2.3 Kiểm tra hoạt động](#2.3) 16 | 17 | [3. Tham khảo](#3) 18 | 19 | - [Script cài đặt tự động] (https://github.com/hoangdh/ghichep-database/tree/master/Galera_on_CentOS/scripts) 20 | 21 | 22 | ## 1. Chuẩn bị 23 | 24 | 25 | ### 1.1. Môi trường cài đặt 26 | 27 | ``` 28 | [root@node1 ~]# cat /etc/redhat-release 29 | CentOS Linux release 7.2.1511 (Core) 30 | [root@node1 ~]# uname -a 31 | Linux node1.hoang.lab 3.10.0-327.28.3.el7.x86_64 #1 SMP Thu Aug 18 19:05:49 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 32 | ``` 33 | 34 | 35 | ### 1.2. Thiết lập IP cho các node 36 | 37 | ``` 38 | IP: 39 | Node 1: 192.168.100.196 40 | Node 2: 192.168.100.197 41 | Node 3: 192.168.100.198 42 | 43 | GATEWAY: 192.168.100.1 44 | NETWORK: 192.168.100.0/24 45 | ``` 46 | 47 | 48 | ### 1.3. Mô hình 49 | 50 | 51 | 52 | 53 | ## 2. Các bước tiến hành 54 | 55 | 56 | ### 2.1. Cài đặt MariaDB trên các node 57 | 58 | #### Cài đặt Repo cho các node và set độ ưu tiên của repo 59 | 60 | ``` 61 | yum -y install centos-release-scl-rh centos-release-scl 62 | sed -i -e "s/\]$/\]\npriority=10/g" /etc/yum.repos.d/CentOS-SCLo-scl.repo 63 | sed -i -e "s/\]$/\]\npriority=10/g" /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo 64 | ``` 65 | 66 | #### Cài đặt MariaDB 67 | 68 | - Cài đặt MariaDB với `yum` 69 | 70 | ``` 71 | yum --enablerepo=centos-sclo-rh -y install rh-mariadb101-mariadb-server 72 | ``` 73 | 74 | - Load các biến môi trường 75 | 76 | ``` 77 | scl enable rh-mariadb101 bash 78 | ``` 79 | 80 | - Kiểm tra phiên bản của MariaDB 81 | 82 | ``` 83 | mysql -V 84 | ``` 85 | 86 | 87 | 88 | - Cho `rh-mariadb` khởi động cùng hệ thống, soạn file với nội dung: 89 | 90 | ``` 91 | vi /etc/profile.d/rh-mariadb101.sh 92 | ``` 93 | 94 | ``` 95 | #!/bin/bash 96 | 97 | source /opt/rh/rh-mariadb101/enable 98 | export X_SCLS="`scl enable rh-mariadb101 'echo $X_SCLS'`" 99 | ``` 100 | 101 | #### Bật MariaDB và cấu hình ban đầu: 102 | 103 | - Khai báo thêm bộ mã hóa ký tự UTF-8 vào file cấu hình 104 | 105 | ``` 106 | vi /etc/opt/rh/rh-mariadb101/my.cnf.d/mariadb-server.cnf 107 | ``` 108 | 109 | - Tìm section `[mysqld]` và thêm vào với nội dung 110 | 111 | ``` 112 | ... 113 | character-set-server=utf8 114 | ... 115 | ``` 116 | 117 | #### Khởi động và cấu hình 118 | 119 | - Bật `MariaDB` và cho khởi động cùng hệ thống: 120 | 121 | ``` 122 | systemctl start rh-mariadb101-mariadb 123 | systemctl enable rh-mariadb101-mariadb 124 | ``` 125 | 126 | - Cài đặt cơ bản 127 | 128 | ``` 129 | mysql_secure_installation 130 | ``` 131 | 132 | 133 | 134 | - Cài đặt tiếp theo 135 | 136 | 137 | 138 | - Kiểm tra Đăng nhập `MariaDB` 139 | 140 | ``` 141 | mysql -uroot -p -e "show databases;" 142 | ``` 143 | 144 | 145 | 146 | 147 | ### 2.2 Cài đặt Galera cho MariaDB 148 | 149 | #### Cài đặt `Galera` trên các node 150 | 151 | ``` 152 | yum --enablerepo=centos-sclo-rh -y install rh-mariadb101-mariadb-server-galera 153 | ``` 154 | 155 | - Cấu hình tường lửa trên các node 156 | 157 | ``` 158 | firewall-cmd --add-service=mysql --permanent 159 | firewall-cmd --add-port={3306/tcp,4567/tcp,4568/tcp,4444/tcp} --permanent 160 | firewall-cmd --reload 161 | ``` 162 | 163 | - Cấu hình ở Node 1: 164 | 165 | ``` 166 | mv /etc/opt/rh/rh-mariadb101/my.cnf.d/galera.cnf /etc/opt/rh/rh-mariadb101/my.cnf.d/galera.cnf.org 167 | vi /etc/opt/rh/rh-mariadb101/my.cnf.d/mariadb-server.cnf 168 | ``` 169 | 170 | - Mở file `mariadb-server.cnf`, tìm đến section `galera` và **chỉnh sửa những dòng** như sau: 171 | 172 | ``` 173 | [galera] 174 | # Mandatory settings 175 | wsrep_on=ON 176 | wsrep_provider=/opt/rh/rh-mariadb101/root/usr/lib64/galera/libgalera_smm.so 177 | wsrep_cluster_address=gcomm:// 178 | 179 | binlog_format=row 180 | default_storage_engine=InnoDB 181 | innodb_autoinc_lock_mode=2 182 | bind-address=0.0.0.0 183 | 184 | # Them moi 3 dong nay 185 | wsrep_cluster_name="MariaDB_Cluster" 186 | wsrep_node_address="192.168.100.196" 187 | wsrep_sst_method=rsync 188 | ``` 189 | 190 | 191 | 192 | - Sau khi chỉnh sửa xong, khởi động `Galera` 193 | 194 | ``` 195 | /opt/rh/rh-mariadb101/root/usr/bin/galera_new_cluster 196 | ``` 197 | 198 | - Cấu hình ở các node còn lại: 199 | 200 | ``` 201 | mv /etc/opt/rh/rh-mariadb101/my.cnf.d/galera.cnf /etc/opt/rh/rh-mariadb101/my.cnf.d/galera.cnf.org 202 | vi /etc/opt/rh/rh-mariadb101/my.cnf.d/mariadb-server.cnf 203 | ``` 204 | 205 | Mở file `mariadb-server.cnf`, tìm đến section `galera` và **chỉnh sửa những dòng** tương ứng: 206 | 207 | ``` 208 | [galera] 209 | # Mandatory settings 210 | wsrep_on=ON 211 | wsrep_provider=/opt/rh/rh-mariadb101/root/usr/lib64/galera/libgalera_smm.so 212 | wsrep_cluster_address="gcomm://192.168.100.196,192.168.100.197,192.168.100.198" 213 | 214 | binlog_format=row 215 | default_storage_engine=InnoDB 216 | innodb_autoinc_lock_mode=2 217 | bind-address=0.0.0.0 218 | 219 | # Them moi nhung dong sau: 220 | wsrep_cluster_name="MariaDB_Cluster" 221 | wsrep_node_address="IP_Của_Node_Tương_Ứng" 222 | wsrep_sst_method=rsync 223 | ``` 224 | 225 | #### Trên node 2: 226 | 227 | 228 | 229 | #### Trên node 3: 230 | 231 | 232 | 233 | - Khởi động lại `MariaDB` trên từng node: 234 | 235 | ``` 236 | systemctl restart rh-mariadb101-mariadb 237 | ``` 238 | 239 | 240 | #### 2.3 Kiểm tra hoạt động 241 | 242 | - Tạo một database ở node 1: 243 | 244 | ``` 245 | mysql -uroot -p -e "create database node1;" 246 | mysql -uroot -p -e "show databases;" 247 | ``` 248 | 249 | 250 | 251 | - Xem và tạo database ở node 2: 252 | 253 | ``` 254 | mysql -uroot -p 255 | 256 | show databases; 257 | create database node2; 258 | ``` 259 | 260 | 261 | 262 | - Xem và tạo database ở node 3: 263 | 264 | ``` 265 | mysql -uroot -p 266 | 267 | show databases; 268 | create database node3; 269 | ``` 270 | 271 | 272 | 273 | - Quay lại node 1, chúng ta kiểm tra lại sẽ có 3 database được tạo: 274 | 275 | ``` 276 | mysql -uroot -p -e "show databases;" 277 | ``` 278 | 279 | 280 | 281 | 282 | ## 3. Tham khảo: 283 | 284 | - https://www.server-world.info/en/note?os=CentOS_7&p=mariadb101&f=4 -------------------------------------------------------------------------------- /Galera_on_CentOS/scripts/README.md: -------------------------------------------------------------------------------- 1 | ## Hướng dẫn sử dụng 2 | 3 | ### Yêu cầu và chuẩn bị: 4 | 5 | - Tải 2 file `galera-3-node.sh` và `var.cfg` về một máy bất kỳ và có thể kết nối tới 3 node muốn cài đặt Cluster 6 | - Đảm bảo giữa 3 node phải kết nối được với nhau 7 | - Trên 3 node muốn cài Galera, phải đặt IP tĩnh 8 | - Khai báo lần lượt địa chỉ IP của các máy chủ vào file `var.cfg` 9 | - Khai báo hostname của từng hostname của các máy chủ 10 | - Khai báo password cho user root của MariaDB (User này có quyền truy cập trên tất cả các host) 11 | 12 | ### Các bước thực hiện: 13 | 14 | - Tải script và file chứa các biến về máy: 15 | 16 | ``` 17 | wget 18 | wget 19 | ``` 20 | 21 | - Chỉnh sửa file `var.cfg` phù hợp với các thông số của bạn 22 | 23 | - `IP1` - `IP3`: Địa chỉ IP của các node mà bạn muốn cài đặt 24 | - `HOST1` - `HOST3`: Tên hostname của các node cài đặt (Tùy chọn) 25 | - `PASSWORD`: Mật khẩu của user `root` trong MariaDB. 26 | 27 | - Phân quyền 28 | 29 | ``` 30 | chown +x 31 | ``` 32 | 33 | - Tiến hành cài đặt - Chạy Script 34 | 35 | ``` 36 | ./ 37 | ``` 38 | 39 | http://linoxide.com/cluster/mariadb-centos-7-galera-cluster-haproxy/ 40 | - chckconfig 41 | - tat selinux 42 | 43 | Sử dụng Script như sau: 44 | 45 | - Sửa file cấu hình `var.cfg` (Địa chỉ IP, HOSTNAME, password cho user root của MySQL) 46 | - Tạo key SSH (Yêu cầu phải nhập password `root` từng host) 47 | - Tự động cài đặt Galera 48 | 49 | *Chúc các bạn thành công!* -------------------------------------------------------------------------------- /Galera_on_CentOS/scripts/backup/README.md: -------------------------------------------------------------------------------- 1 | ## Hướng dẫn sử dụng 2 | 3 | [1. Giới thiệu ](#1) 4 | 5 | [2. Yêu cầu](#2) 6 | 7 | [3. Các bước thực hiện](#3) 8 | 9 | 10 | ### 1. Giới thiệu 11 | 12 | Script này sẽ giúp các bạn cài đặt và cấu hình tự động Galera 3 node cho MariaDB trên CentOS 7. Các bạn có thể xem bài hướng dẫn cài đặt bằng tay ở đây để hiểu rõ hơn quá trình làm việc của script. 13 | 14 | 15 | ### 2. Yêu cầu: 16 | 17 | - Trên các node phải triển khai SSH-Key (Không có passphare) 18 | - Các SSH-Key phải được đặt tên theo node. Key của node thứ nhất có tên là `node1`, key của node thứ hai có tên là `node2` và key của node thứ 3 là `node3`. 19 | - Các file cấu hình `conf.cfg`, script `galera.bash` và SSH-Key của các node phải nằm trong cùng một thư mục. 20 | - Khi cài đặt và cấu hình, script sẽ không đặt mật khẩu tài khoản `root` trên bất cứ host nào, mặc định password trống. Vì vậy hãy thay đổi nó ngay sau khi quá trình cài đặt thành công. 21 | 22 | *Script có thể chạy trên một máy bất kỳ hoặc trên 1 trong 3 node đáp ứng đủ các yêu cầu trên..* 23 | 24 | 25 | ### 3. Các bước thực hiện 26 | 27 | - **Bước 1**: Khai báo thông tin các node của bạn vào file `conf.cfg` theo mẫu: 28 | 29 | ``` 30 | export IP1=192.168.100.196 31 | export IP2=192.168.100.197 32 | export IP3=192.168.100.198 33 | ``` 34 | 35 | **Chú thích**: 36 | - `IP1` là địa chỉ IP của node 1 37 | - `IP2` là địa chỉ IP của node 2 38 | - `IP3` là địa chỉ IP của node 3 39 | 40 | - **Bước 2**: Kiểm tra lại các file cấu hình `var.cfg`, script `galera.bash` và SSH-Key của các node trong thư mục 41 | 42 | - **Bước 3**: Phân quyền chạy cho script 43 | 44 | ``` 45 | chmod 755 galera.bash 46 | ``` 47 | - **Bước 4**: Chạy script 48 | 49 | ``` 50 | ./galera.bash 51 | ``` 52 | 53 | *Chúc các bạn thành công!* -------------------------------------------------------------------------------- /Galera_on_CentOS/scripts/backup/conf.cfg: -------------------------------------------------------------------------------- 1 | export IP1=192.168.100.196 2 | export IP2=192.168.100.197 3 | export IP3=192.168.100.198 4 | -------------------------------------------------------------------------------- /Galera_on_CentOS/scripts/backup/galera.bash: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | source conf.cfg 3 | 4 | ham() 5 | { 6 | cat > mariadb.repo << H2 7 | [mariadb] 8 | name = MariaDB 9 | baseurl = http://yum.mariadb.org/10.0/rhel7-amd64/ 10 | gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB 11 | gpgcheck=1 12 | H2 13 | 14 | scp -i node$1 mariadb.repo root@$2:/etc/yum.repos.d/ 15 | ssh -i node$1 root@$2 "setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config" 16 | ssh -i node$1 root@$2 "yum install MariaDB-Galera-server MariaDB-client galera -y" 17 | cat > galera.cnf << H2 18 | [galera] 19 | # Mandatory settings 20 | wsrep_provider=/usr/lib64/galera/libgalera_smm.so 21 | wsrep_cluster_address='gcomm://$IP1,$IP2,$IP3' 22 | wsrep_cluster_name='mariadb_cluster' 23 | wsrep_node_address='$2' 24 | wsrep_sst_method=rsync 25 | binlog_format=row 26 | default_storage_engine=InnoDB 27 | innodb_autoinc_lock_mode=2 28 | bind-address=0.0.0.0 29 | H2 30 | scp -i node$1 galera.cnf root@$2:/etc/my.cnf.d/ 31 | if [ "$1" = "1" ] 32 | then 33 | ssh -i node$1 root@$2 "/etc/init.d/mysql restart --wsrep-new-cluster" 34 | else 35 | ssh -i node$1 root@$2 "/etc/init.d/mysql restart" 36 | fi 37 | 38 | } 39 | # 40 | for x in $IP1 $IP2 $IP3 41 | do 42 | list=`cat conf.cfg` 43 | for i in $list 44 | do 45 | y=`echo $i | grep -w "$x"` 46 | if [ -n "$y" ] 47 | then 48 | NODE=`echo $y | awk -F = '{print $1}' | awk -F P {'print $2'}` 49 | ham $NODE $x 50 | fi 51 | done 52 | done 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /Galera_on_CentOS/scripts/galera-3-node.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set_host() 4 | { 5 | . ./var.cfg 6 | ### Write to hosts 7 | echo -e "$IP1 $HOST1 8 | $IP2 $HOST2 9 | $IP3 $HOST3" >> /etc/hosts 10 | ### Gen-key 11 | ssh-keygen -t rsa -N "" -f ~/.ssh/hoangdh.key 12 | mv ~/.ssh/hoangdh.key.pub ~/.ssh/authorized_keys 13 | mv ~/.ssh/hoangdh.key ~/.ssh/id_rsa 14 | chmod 600 ~/.ssh/authorized_keys 15 | 16 | for ip in $IP1 $IP2 $IP3 17 | do 18 | NODE=`cat var.cfg | grep -w "$ip" | awk -F = '{print $1}' | awk -F P {'print $2'}` 19 | HOST=`cat var.cfg | grep -e "HOST$NODE" | awk -F = '{print $2}'` 20 | scp -r ~/.ssh/ $HOST:~/ 21 | # hostnamectl set-hostname $HOST -H root@$HOST 22 | ssh $HOST "hostnamectl set-hostname $HOST" 23 | echo "Set hostname for host $ip: $NODE - $HOST" 24 | scp /etc/hosts root@$HOST:/etc/ 25 | done 26 | } 27 | 28 | setup () 29 | { 30 | cat > mariadb.repo << H2 31 | [mariadb] 32 | name = MariaDB 33 | baseurl = http://yum.mariadb.org/10.0/rhel7-amd64/ 34 | gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB 35 | gpgcheck=1 36 | H2 37 | 38 | scp mariadb.repo root@$1:/etc/yum.repos.d/ 39 | ssh root@$1 "setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config" 40 | ssh root@$1 "yum install MariaDB-Galera-server MariaDB-client galera -y" 41 | cat > galera.cnf << H2 42 | [galera] 43 | # Mandatory settings 44 | wsrep_provider=/usr/lib64/galera/libgalera_smm.so 45 | wsrep_cluster_address='gcomm://$IP1,$IP2,$IP3' 46 | wsrep_cluster_name='mariadb_cluster' 47 | wsrep_node_address='$1' 48 | wsrep_sst_method=rsync 49 | binlog_format=row 50 | default_storage_engine=InnoDB 51 | innodb_autoinc_lock_mode=2 52 | bind-address=0.0.0.0 53 | H2 54 | scp galera.cnf root@$1:/etc/my.cnf.d/ 55 | if [ "$2" = "1" ] 56 | then 57 | 58 | ssh root@$1 "/etc/init.d/mysql restart --wsrep-new-cluster" 59 | ssh root@$1 "mysql -uroot -e \"set password for 'root'@'localhost' = password('$PASSWORD');\"" 60 | ssh root@$1 "mysql -uroot -p$PASSWORD -e \"DELETE from mysql.user where Password = '';\"" 61 | ssh root@$1 "mysql -uroot -p$PASSWORD -e \"CREATE USER 'root'@'%' IDENTIFIED BY '$PASSWORD';\"" 62 | ssh root@$1 "mysql -uroot -p$PASSWORD -e \"GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';\"" 63 | ssh root@$1 "mysql -uroot -p$PASSWORD -e \"FLUSH PRIVILEGES;\"" 64 | 65 | elif [ "$2" = "2" ] 66 | then 67 | ssh root@$1 "/etc/init.d/mysql restart" 68 | ssh root@$1 "mysql -uroot -e \"set password for 'root'@'localhost' = password('$PASSWORD');\"" 69 | ssh root@$1 "mysql -uroot -p$PASSWORD -e \"DELETE from mysql.user where Password = '';\"" 70 | ssh root@$1 "mysql -uroot -p$PASSWORD -e \"drop database test;\"" 71 | else 72 | ssh root@$1 "/etc/init.d/mysql restart" 73 | fi 74 | } 75 | 76 | set_host 77 | for x in $IP1 $IP2 $IP3 78 | do 79 | list=`cat var.cfg` 80 | for i in $list 81 | do 82 | y=`echo $i | grep -w "$x"` 83 | if [ -n "$y" ] 84 | then 85 | NODE=`echo $y | awk -F = '{print $1}' | awk -F P {'print $2'}` 86 | setup $x $NODE 87 | ssh root@$x "chkconfig mysql on" 88 | fi 89 | done 90 | done -------------------------------------------------------------------------------- /Galera_on_CentOS/scripts/var.cfg: -------------------------------------------------------------------------------- 1 | export IP1=192.168.100.139 2 | export IP2=192.168.100.140 3 | export IP3=192.168.100.142 4 | export HOST1=mysql01 5 | export HOST2=mysql02 6 | export HOST3=mysql03 7 | export PASSWORD=abc@123 -------------------------------------------------------------------------------- /Galera_on_Ubuntu/README.md: -------------------------------------------------------------------------------- 1 | # Ghi chép cài đặt Galera Cluster 2 | 3 | ### Menu 4 | 5 | [1. Giới thiệu về Galera](#1) 6 | 7 | [2. Chuẩn bị ](#2) 8 | 9 | - [2.1 Chuẩn bị](#2.1) 10 | - [2.2 Thiết lập IP cho các node](#2.2) 11 | - [2.3 Mô hình](#2.3) 12 | 13 | [3. Các bước tiến hành](#3) 14 | 15 | - [Bước 1. Thêm repo cho các máy chủ](#3.1) 16 | - [Bước 2. Cài đặt MySQL và Galera trên các máy chủ](#3.2) 17 | - [Bước 3. Cấu hình ở máy chủ thứ nhất](#3.3) 18 | - [Bước 4. Cấu hình trên các node còn lại](#3.4) 19 | - [Bước 5. Cấu hình Firewall trên các máy chủ](#3.5) 20 | - [Bước 6. Khởi động Cluster](#3.6) 21 | - [Bước 7. Cấu hình Debian Maintenance User](#3.7) 22 | - [Bước 8. Kiểm tra hoạt động](#3.8) 23 | 24 | [4. Kết luận](#4) 25 | 26 | 27 | ## 1. Giới thiệu Galera 28 | 29 | **Galera Cluster** là giải pháp tăng tính sẵn sàng cho cách Database bằng các phân phối các thay đổi (đọc - ghi dữ liệu) tới các máy chủ trong Cluster. Trong trường hợp một máy chủ bị lỗi thì các máy chủ khác vẫn sẵn sàng hoạt động phục vụ các yêu cầu từ phía người dùng. 30 | 31 | 32 | 33 | Cluster có 2 mode hoạt động là **Active - Passive** và **Active - Active**: 34 | 35 | - **Active - Passive**: Tất cả các thao tác ghi sẽ được thực hiện ở máy chủ Active, sau đó sẽ được sao chép sang các máy chủ Passive. Các máy chủ Passive này sẽ sẵn sàng đảm nhiệm vai trò của máy chủ Active khi xảy ra sự cố. Trong một vài trường hợp, **Active - Passive** cho phép `SELECT` ở các máy chủ Passive. 36 | - **Active - Active**: Thao tác đọc - ghi dữ liệu sẽ diễn ra ở mỗi node. Khi có thay đổi, dữ liệu sẽ được đồng bộ tới tất cả các node 37 | 38 | Bài hướng dẫn dưới đây tôi sẽ cấu hình cho nó hoạt động ở mode **Active - Active**. 39 | 40 | 41 | ## 2. Chuẩn bị 42 | 43 | 44 | ### 2.1. Môi trường cài đặt 45 | 46 | ``` 47 | root@node3:~# lsb_release -a 48 | No LSB modules are available. 49 | Distributor ID: Ubuntu 50 | Description: Ubuntu 16.04.1 LTS 51 | Release: 16.04 52 | Codename: xenial 53 | root@node3:~# uname -a 54 | Linux node3.hoang.lab 4.4.0-36-generic #55-Ubuntu SMP Thu Aug 11 18:01:55 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 55 | ``` 56 | 57 | 58 | ### 2.2. Thiết lập IP cho các node 59 | 60 | ``` 61 | IP: 62 | Node 1: 192.168.100.192 63 | Node 2: 192.168.100.193 64 | Node 3: 192.168.100.194 65 | 66 | GATEWAY: 192.168.100.1 67 | ``` 68 | 69 | 70 | ### 2.3. Mô hình 71 | 72 | 73 | 74 | 75 | ## 3. Các bước tiến hành 76 | 77 | 78 | ### Bước 1: Thêm repo cho các máy chủ 79 | 80 | ``` 81 | apt-key adv --keyserver keyserver.ubuntu.com --recv 44B7345738EBDE52594DAD80D669017EBC19DDBA 82 | add-apt-repository 'deb [arch=amd64,i386] http://releases.galeracluster.com/ubuntu/ xenial main' 83 | apt-get update 84 | ``` 85 | 86 | 87 | ### Bước 2: Cài đặt MySQL và Galera trên các máy chủ 88 | 89 | ``` 90 | apt-get install galera-3 galera-arbitrator-3 mysql-wsrep-5.6 91 | apt-get install rsync 92 | ``` 93 | 94 | Trong khi cài đặt mysql có yêu cầu nhập password cho `root` - quản lý MySQL 95 | 96 | 97 | 98 | **Note:** `rsync` là thành phần thiết yếu của Galera. 99 | 100 | 101 | ### Bước 3: Cấu hình ở máy chủ thứ nhất 102 | 103 | Tạo một file có tên `galera.cnf` trong thư mục `/etc/mysql/conf.d` với nội dung 104 | 105 | ``` 106 | vi /etc/mysql/conf.d/galera.cnf 107 | ``` 108 | 109 | ``` 110 | [mysqld] 111 | query_cache_size=0 112 | binlog_format=ROW 113 | default-storage-engine=innodb 114 | innodb_autoinc_lock_mode=2 115 | query_cache_type=0 116 | bind-address=0.0.0.0 117 | 118 | # Galera Provider Configuration 119 | wsrep_on=ON 120 | wsrep_provider=/usr/lib/galera/libgalera_smm.so 121 | 122 | # Galera Cluster Configuration 123 | wsrep_cluster_name="test_cluster" 124 | wsrep_cluster_address="gcomm://first_ip,second_ip,third_ip" 125 | 126 | # Galera Synchronization Configuration 127 | wsrep_sst_method=rsync 128 | 129 | # Galera Node Configuration 130 | wsrep_node_address="this_node_ip" 131 | wsrep_node_name="this_node_name" 132 | ``` 133 | 134 | Note: 135 | 136 | - Điền địa chỉ IP của các máy chủ thay thế `first_ip,second_ip,third_ip` 137 | - Điền địa chỉ IP của node đang cấu hình vào trường `this_node_ip` 138 | - Điền tên của node vào `this_node_name` (Tên tùy chọn, phục vụ cho việc Debug) 139 | 140 | 141 | 142 | **Tiếp theo**, vào file `my.cnf` và comment out lại dòng `bind-address` 143 | 144 | ``` 145 | vi /etc/mysql/my.cnf 146 | ``` 147 | 148 | 149 | 150 | 151 | ### Bước 4: Cấu hình trên các node còn lại 152 | 153 | Ở các node còn lại, chúng ta copy file `galera.cnf` ở node thứ nhất vào thư mục `/etc/mysql/conf.d/` của 2 node còn lại. Chỉnh sửa nội dung cho phù hợp với node. Cụ thể 154 | 155 | ``` 156 | . . . 157 | # Galera Node Configuration 158 | wsrep_node_address="this_node_ip" 159 | wsrep_node_name="this_node_name" 160 | . . . 161 | ``` 162 | 163 | Thay thế `this_node_ip` và `this_node_name` ở file `galera.cnf` 164 | 165 | Trên node 2: 166 | 167 | 168 | 169 | Trên node 3: 170 | 171 | 172 | 173 | Cũng như ở node 1, trên các node còn lại, chúng ta vào `my.cnf` và comment out dòng `bind-address` 174 | 175 | ``` 176 | vi /etc/mysql/my.cnf 177 | ``` 178 | 179 | Trên node 2: 180 | 181 | 182 | 183 | Trên node 3: 184 | 185 | 186 | 187 | 188 | ### Bước 5: Cấu hình Firewall trên các máy chủ 189 | 190 | `Galera` sử dụng 4 port để làm việc 191 | 192 | - `3306`: Cho phép các MySQL-Client kết nối đến server 193 | - `4567`: Cho phép các máy chủ có replication các trafic với nhau và hoạt động ở cả UDP và TCP 194 | - `4568`: For Incremental State Transfer. 195 | - `4444`: For all other State Snapshot Transfer. 196 | 197 | ``` 198 | ufw enable 199 | ufw allow 22,3306,4567,4568,4444/tcp 200 | ufw allow 4567/udp 201 | ``` 202 | 203 | 204 | 205 | Khi bật Firewall, hệ thống sẽ hỏi có giữ lại phiên SSH hiện tại. Chúng ta chọn `Y` và tiếp tục cấu hình các bước tiếp theo. Câu lệnh `ufw status` có trong hình để xem lại trạng thái của Firewall. 206 | 207 | 208 | ### Bước 6: Khởi động Cluster 209 | 210 | #### Stop dịch vụ mysql trên tất cả các node 211 | 212 | ``` 213 | systemctl stop mysql 214 | ``` 215 | 216 | #### Chạy dịch vụ ở node 1 217 | 218 | ``` 219 | /etc/init.d/mysql start --wsrep-new-cluster 220 | ``` 221 | 222 | Kiểm tra bằng câu lệnh 223 | 224 | ``` 225 | mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'" 226 | ``` 227 | 228 | Kết quả hiện ra 229 | 230 | ``` 231 | +--------------------+-------+ 232 | | Variable_name | Value | 233 | +--------------------+-------+ 234 | | wsrep_cluster_size | 1 | 235 | +--------------------+-------+ 236 | ``` 237 | 238 | 239 | 240 | #### Chạy dịch vụ ở node 2 241 | 242 | ``` 243 | systemctl start mysql 244 | ``` 245 | 246 | Kiểm tra bằng câu lệnh 247 | 248 | ``` 249 | mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'" 250 | ``` 251 | 252 | Kết quả hiện ra 253 | 254 | ``` 255 | +--------------------+-------+ 256 | | Variable_name | Value | 257 | +--------------------+-------+ 258 | | wsrep_cluster_size | 2 | 259 | +--------------------+-------+ 260 | ``` 261 | 262 | 263 | 264 | #### Chạy dịch vụ ở node 3 265 | 266 | ``` 267 | systemctl start mysql 268 | ``` 269 | 270 | Kiểm tra bằng câu lệnh 271 | 272 | ``` 273 | mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'" 274 | ``` 275 | 276 | Kết quả hiện ra 277 | 278 | ``` 279 | +--------------------+-------+ 280 | | Variable_name | Value | 281 | +--------------------+-------+ 282 | | wsrep_cluster_size | 3 | 283 | +--------------------+-------+ 284 | ``` 285 | 286 | 287 | 288 | 289 | ### Bước 7: Cấu hình Debian Maintenance User 290 | 291 | Hiện tại, trên Ubuntu và Các máy chủ mysql của Debian sẽ có một user đặc biệt để thực hiện các quá trình trong Galera. Mặc định, khi cài đặt sẽ có một user được tạo ra và được ghi ở `/etc/mysql/debian.cnf` trên mỗi server. 292 | 293 | #### Copy file từ máy chủ thứ nhất (node 1) ra các máy chủ còn lại 294 | 295 | Bước này khá đơn giản, chúng ta copy file `debian.cnf` từ server thứ nhất sang các server khác 296 | 297 | Nội dung của file: 298 | 299 | ``` 300 | [client] 301 | host = localhost 302 | user = debian-sys-maint 303 | password = 03P8rdlknkXr1upf 304 | socket = /var/run/mysqld/mysqld.sock 305 | [mysql_upgrade] 306 | host = localhost 307 | user = debian-sys-maint 308 | password = 03P8rdlknkXr1upf 309 | socket = /var/run/mysqld/mysqld.sock 310 | basedir = /usr 311 | ``` 312 | 313 | Thử đăng nhập vào mysql: 314 | 315 | ``` 316 | mysql -u debian-sys-maint -p 317 | ``` 318 | 319 | 320 | 321 | Nếu không được, hãy đăng nhập vào bằng `root` và chỉnh sửa lại password cho nó. 322 | 323 | ``` 324 | update mysql.user set password=PASSWORD('password_from_debian.cnf') where User='debian-sys-maint'; 325 | ``` 326 | 327 | **Note:** Thay thế `password_from_debian.cnf` bằng chuỗi trong password trong file `debian.cnf` 328 | 329 | 330 | ### Bước 8: Test 331 | 332 | #### Ghi dữ liệu vào Node 1 333 | 334 | ``` 335 | mysql -u root -p -e 'CREATE DATABASE playground; 336 | CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id)); 337 | INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");' 338 | ``` 339 | 340 | 341 | 342 | #### Đọc và ghi dữ liệu vào Node 2 343 | 344 | ``` 345 | mysql -u root -p -e 'SELECT * FROM playground.equipment;' 346 | ``` 347 | 348 | Kết quả: 349 | 350 | 351 | 352 | Ghi dữ liệu: 353 | 354 | ``` 355 | mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");' 356 | ``` 357 | 358 | 359 | 360 | #### Đọc và ghi dữ liệu trên Node 3 361 | 362 | ``` 363 | mysql -u root -p -e 'SELECT * FROM playground.equipment;' 364 | ``` 365 | 366 | Kết quả: 367 | 368 | 369 | 370 | Ghi dữ liệu 371 | 372 | ``` 373 | mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");' 374 | ``` 375 | 376 | 377 | 378 | #### Đọc dữ liệu trên Node 1 379 | 380 | ``` 381 | mysql -u root -p -e 'SELECT * FROM playground.equipment;' 382 | ``` 383 | 384 | Kết quả: 385 | 386 | 387 | 388 | 389 | ## 4. Kết luận 390 | 391 | Trên đây là hướng dẫn cấu hình Galera với mô hình hoạt động là **Active - Active** trên hệ điều hành Ubuntu 16. Hy vọng có thể giúp ích cho hệ thống của các bạn. Chúc các bạn thành công! -------------------------------------------------------------------------------- /Galera_on_Ubuntu/scripts/README.md: -------------------------------------------------------------------------------- 1 | ## Hướng dẫn sử dụng 2 | 3 | [1. Giới thiệu ](#1) 4 | 5 | [2. Yêu cầu](#2) 6 | 7 | [3. Các bước thực hiện](#3) 8 | 9 | 10 | ### 1. Giới thiệu 11 | 12 | Script này sẽ giúp các bạn cài đặt và cấu hình tự động Galera 3 node cho MySQL trên Ubuntu. Các bạn có thể xem bài hướng dẫn cài đặt bằng tay ở đây để hiểu rõ hơn quá trình làm việc của script. 13 | 14 | 15 | ### 2. Yêu cầu: 16 | 17 | - Trên các node phải triển khai SSH-Key (Không có passphare) 18 | - Các SSH-Key phải được đặt tên theo node. Key của node thứ nhất có tên là `node1`, key của node thứ hai có tên là `node2` và key của node thứ 3 là `node3`. 19 | - Các file cấu hình `conf.cfg`, script `galera.bash` và SSH-Key của các node phải nằm trong cùng một thư mục. 20 | - Khi cài đặt và cấu hình, script sẽ không đặt mật khẩu tài khoản `root` trên bất cứ host nào, mặc định password trống. Vì vậy hãy thay đổi nó ngay sau khi quá trình cài đặt thành công. 21 | 22 | *Script có thể chạy trên một máy bất kỳ hoặc trên 1 trong 3 node đáp ứng đủ các yêu cầu trên..* 23 | 24 | 25 | ### 3. Các bước thực hiện 26 | 27 | - **Bước 1**: Khai báo thông tin các node của bạn vào file `conf.cfg` theo mẫu: 28 | 29 | ``` 30 | export IP1=192.168.100.196 31 | export IP2=192.168.100.197 32 | export IP3=192.168.100.198 33 | ``` 34 | 35 | **Chú thích**: 36 | - `IP1` là địa chỉ IP của node 1 37 | - `IP2` là địa chỉ IP của node 2 38 | - `IP3` là địa chỉ IP của node 3 39 | 40 | - **Bước 2**: Kiểm tra lại các file cấu hình `var.cfg`, script `galera.bash` và SSH-Key của các node trong thư mục 41 | 42 | - **Bước 3**: Phân quyền chạy cho script 43 | 44 | ``` 45 | chmod 755 galera-u.bash 46 | ``` 47 | - **Bước 4**: Chạy script 48 | 49 | ``` 50 | ./galera-u.bash 51 | ``` 52 | 53 | *Chúc các bạn thành công!* -------------------------------------------------------------------------------- /Galera_on_Ubuntu/scripts/galera-u.bash: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cauhinhchung() 4 | { 5 | ssh -i node$1 root@$2 "apt-key adv --keyserver keyserver.ubuntu.com --recv 44B7345738EBDE52594DAD80D669017EBC19DDBA" 6 | ## Thay vao dong 5 U16: wget -qO - http://releases.galeracluster.com/GPG-KEY-galeracluster.com | sudo apt-key add - 7 | ssh -i node$1 root@$2 "add-apt-repository 'deb [arch=amd64,i386] http://releases.galeracluster.com/ubuntu/ xenial main'" 8 | ssh -i node$1 root@$2 "debconf-set-selections <<< \"mysql-server mysql-server/root_password password $PASSWORD\"" 9 | ssh -i node$1 root@$2 "debconf-set-selections <<< \"mysql-server mysql-server/root_password_again password $PASSWORD\"" 10 | ssh -i node$1 root@$2 "apt-get update" 11 | ssh -i node$1 root@$2 "apt-get install -y galera-3 galera-arbitrator-3 mysql-wsrep-5.6 rsync" 12 | 13 | cat > galera.cnf << H2 14 | [mysqld] 15 | binlog_format=ROW 16 | default-storage-engine=innodb 17 | innodb_autoinc_lock_mode=2 18 | bind-address=0.0.0.0 19 | 20 | # Galera Provider Configuration 21 | wsrep_on=ON 22 | wsrep_provider=/usr/lib/galera/libgalera_smm.so 23 | 24 | # Galera Cluster Configuration 25 | wsrep_cluster_name="test_cluster" 26 | wsrep_cluster_address="gcomm://$IP1,$IP2,$IP3" 27 | 28 | # Galera Synchronization Configuration 29 | wsrep_sst_method=rsync 30 | 31 | # Galera Node Configuration 32 | wsrep_node_address="$2" 33 | wsrep_node_name="Galera_Node_$1" 34 | H2 35 | scp -i node$1 galera.cnf root@$2:/etc/mysql/conf.d/ 36 | ssh -i node$1 root@$2 "sed -i '/bind-address/ s/^#*/#/g' /etc/mysql/my.cnf" 37 | ssh -i node$1 root@$2 "ufw allow 3306,4567,4568,4444/tcp && ufw allow 4567/udp && /etc/init.d/mysql stop" 38 | 39 | # ssh -i node$1 root@$2 40 | # ssh -i node$1 root@$2 41 | } 42 | 43 | khoidongnode1() 44 | { 45 | scp -i node$1 root@$2:/etc/mysql/debian.cnf . 46 | ssh -i node$1 root@$2 "/etc/init.d/mysql start --wsrep-new-cluster" 47 | } 48 | 49 | khoidongnodekhac() 50 | { 51 | scp -i node$1 debian.cnf root@$2:/etc/mysql/ 52 | ssh -i node$1 root@$2 "/etc/init.d/mysql start" 53 | if [ "$1" = "3" ] 54 | then 55 | ssh -i node$1 root@$2 "mysql -uroot -p$PASSWORD -e \"SHOW STATUS LIKE 'wsrep_cluster_size'\"" 56 | fi 57 | } 58 | 59 | . var.cfg 60 | for ip in $IP1 $IP2 $IP3 61 | do 62 | NODE=`cat var.cfg | grep -w "$ip" | awk -F = '{print $1}' | awk -F P {'print $2'}` 63 | if [ "$NODE" = "1" ] 64 | then 65 | echo "Cai dat Node $NODE" 66 | cauhinhchung $NODE $ip 67 | khoidongnode1 $NODE $ip 68 | else 69 | echo "Cai dat Node $NODE" 70 | cauhinhchung $NODE $ip 71 | khoidongnodekhac $NODE $ip 72 | fi 73 | done -------------------------------------------------------------------------------- /Galera_on_Ubuntu/scripts/var.cfg: -------------------------------------------------------------------------------- 1 | export PASSWORD=abc@123 2 | export IP1=192.168.100.192 3 | export IP2=192.168.100.193 4 | export IP3=192.168.100.194 5 | -------------------------------------------------------------------------------- /HA-cho-MariaDB-tren-CentOS7/README.md: -------------------------------------------------------------------------------- 1 | ## Hướng dẫn cấu hình HA cho MariaDB sử dụng Pacemaker+Corosync và DRBD trên CentOS 7 2 | 3 | *Chúng ta sẽ sử dụng 2 node Active/Passive cho MariaDB HA cluster sử dụng Pacemaker+Corosync* 4 | 5 | [1. Chuẩn bị ](#1) 6 | 7 | - [1.1. Môi trường cài đặt](#1.1) 8 | - [1.2. Thiết lập IP cho các node](#1.2) 9 | - [1.3. Mô hình](#1.3) 10 | 11 | [2. Các bước tiến hành](#2) 12 | 13 | - [2.1 Thêm thông tin các node vào file hosts](#2.1) 14 | - [2.2 Cài đặt Pacemaker và Corosync](#2.2) 15 | - [2.3 Cấu hình Corosync](#2.3) 16 | - [2.4 Cài đặt DRBD và MariaDB](#2.4) 17 | - [2.4.1 DRBD ](#2.4.1) 18 | - [2.4.2 Tạo LVM Volume cho DRBD ](#2.4.2) 19 | - [2.4.3 Cấu hình DRBD ](#2.4.3) 20 | - [2.4.4 MariaDB ](#2.4.4) 21 | - [2.5 Cấu hình pacemaker ](#2.5) 22 | 23 | [3. Tham khảo](#3) 24 | 25 | 26 | ## 1. Chuẩn bị 27 | 28 | 29 | ### 1.1. Môi trường cài đặt 30 | 31 | ``` 32 | [root@pcmk01 ~]# cat /etc/redhat-release 33 | CentOS Linux release 7.2.1511 (Core) 34 | [root@pcmk01 ~]# uname -a 35 | Linux pcmk01.hoang.lab 3.10.0-327.28.3.el7.x86_64 #1 SMP Tue Oct 11 8:35:45 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 36 | ``` 37 | 38 | Chuẩn bị một Volume Group để lưu trữ các file đồng bộ từ drbd. (Dung lượng tùy theo kích cỡ DB của bạn, trong bài hướng dẫn tôi có một Volume Group có dung lượng trống lớn hơn 1GB. Nếu chưa rõ về khái niệm này, vui lòng đọc hướng dẫn tại đây .) 39 | 40 | 41 | ### 1.2. Thiết lập IP và hostname cho các node 42 | 43 | ``` 44 | VIP: 192.168.100.123 45 | ``` 46 | 47 | ``` 48 | IP: 49 | Node 1: 192.168.100.196 - Hostname: pcmk01.hoang.lab 50 | Node 2: 192.168.100.197 - Hostname: pcmk02.hoang.lab 51 | 52 | GATEWAY: 192.168.100.1 53 | NETWORK: 192.168.100.0/24 54 | ``` 55 | 56 | 57 | ### 1.3. Mô hình 58 | 59 | 60 | 61 | 62 | ## 2. Các bước thực hiện 63 | 64 | 65 | ### 2.1. Thêm thông tin các node vào file `hosts` của 2 node 66 | 67 | ``` 68 | vi /etc/hosts 69 | ``` 70 | 71 | ``` 72 | ... 73 | 192.168.100.196 pcmk01 pcmk01-cr pcmk01-drbd 74 | 192.168.100.197 pcmk02 pcmk02-cr pcmk02-drbd 75 | ``` 76 | 77 | Đặt hostname cho 2 node 78 | 79 | Trên node 1: 80 | 81 | ``` 82 | hostnamectl set-hostname pcmk01 83 | ``` 84 | 85 | Trên node 2: 86 | 87 | ``` 88 | hostnamectl set-hostname pcmk02 89 | ``` 90 | 91 | Tắt IPv6 trên cả 2 node 92 | 93 | ``` 94 | vi /etc/sysctl.conf 95 | ``` 96 | 97 | ``` 98 | net.ipv6.conf.all.disable_ipv6 = 1 99 | net.ipv6.conf.default.disable_ipv6 = 1 100 | ``` 101 | 102 | Xem lại cấu hình: 103 | 104 | ``` 105 | sysctl -p 106 | ``` 107 | 108 | Cấu hình SELinux ở chế độ enforcing. 109 | 110 | 111 | ### 2.2 Cài đặt Pacemaker và Corosync 112 | 113 | Chạy các lệnh sau trên cả 2 node: 114 | 115 | - Cài đặt pcs 116 | 117 | ``` 118 | yum install -y pcs 119 | ``` 120 | 121 | PSC sẽ cài đặt tất cả những gì liên quan tới Pacemaker và Corosync 122 | 123 | - Cài gói quản lý SELinux: 124 | 125 | ``` 126 | yum install -y policycoreutils-python 127 | ``` 128 | 129 | - Đặt password cho user của pcs có tên là `hacluster` 130 | 131 | ``` 132 | echo "passwd" | passwd hacluster --stdin 133 | ``` 134 | 135 | **Chú ý**: Thay `'passwd'` bằng mật khẩu của bạn. 136 | 137 | Khởi động dịch vụ pcs: 138 | 139 | ``` 140 | systemctl start pcsd.service 141 | systemctl enable pcsd.service 142 | ``` 143 | 144 | 145 | ### 2.3 Cấu hình Corosync 146 | 147 | Bước thực hiện trên node 1 148 | 149 | - Xác thực 2 node với nhau thông qua user `hacluster`. Token của quá trình được lưu trữ tại `/var/lib/pcsd/tokens` 150 | 151 | ``` 152 | pcs cluster auth pcmk01-cr pcmk02-cr -u hacluster -p passwd 153 | ``` 154 | 155 | - Tạo file cấu hình và đồng bộ chúng 156 | 157 | ``` 158 | pcs cluster setup --name mysql_cluster pcmk01-cr pcmk02-cr 159 | ``` 160 | 161 | - Khởi động cluster trên tất cả các node 162 | 163 | ``` 164 | pcs cluster start --all 165 | ``` 166 | 167 | 168 | ### 2.4 Cài đặt DRBD và MariaDB 169 | 170 | 171 | 172 | #### 2.4.1 DRBD 173 | 174 | Nôm na, DRBD đồng bộ dữ liệu 2 block devices thông qua mạng. Có thể nói đây là cơ chế RAID-1 của các thiết bị logic. 175 | 176 | - Chúng ta cài đặt DRBD trên cả 2 node: 177 | 178 | ``` 179 | rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 180 | rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm 181 | yum install -y kmod-drbd84 drbd84-utils 182 | ``` 183 | 184 | - Cho phép các xử lý của DRBD qua SELinux 185 | 186 | ``` 187 | semanage permissive -a drbd_t 188 | ``` 189 | 190 | 191 | 192 | #### 2.4.2 Tạo LVM Volume cho DRBD 193 | 194 | Chúng ta tạo một logic volume trên cả 2 node, như đã nói ở trên thì tùy theo dung lượng DB của các bạn mà tạo dung lượng cho phù hợp. Bài hướng dẫn tôi sẽ demo dung lượng 1GB. 195 | 196 | Kiểm tra dung lượng Volume Group 197 | 198 | ``` 199 | vgs 200 | VG #PV #LV #SN Attr VSize VFree 201 | vg_centos7 1 3 0 wz--n- 63.21g 45.97g 202 | ``` 203 | 204 | Tạo mới một Logical Volume 205 | 206 | ``` 207 | lvcreate --name lv_drbd --size 1024M vg_centos7 208 | ``` 209 | 210 | 211 | #### 2.4.3 Cấu hình DRBD 212 | 213 | Cấu hình DRBD sử dụng mode `single-primary` với giao thức replication C 214 | 215 | - Tạo file cấu hình trên cả 2 node 216 | 217 | ``` 218 | vi /etc/drbd.d/mysql01.res 219 | ``` 220 | 221 | ``` 222 | resource mysql01 { 223 | protocol C; 224 | meta-disk internal; 225 | device /dev/drbd0; 226 | disk /dev/vg_centos7/lv_drbd; 227 | handlers { 228 | split-brain "/usr/lib/drbd/notify-split-brain.sh root"; 229 | } 230 | net { 231 | allow-two-primaries no; 232 | after-sb-0pri discard-zero-changes; 233 | after-sb-1pri discard-secondary; 234 | after-sb-2pri disconnect; 235 | rr-conflict disconnect; 236 | } 237 | disk { 238 | on-io-error detach; 239 | } 240 | syncer { 241 | verify-alg sha1; 242 | } 243 | on pcmk01 { 244 | address 192.168.100.196:7789; 245 | } 246 | on pcmk02 { 247 | address 192.168.100.197:7789; 248 | } 249 | } 250 | ``` 251 | 252 | Ở đây, chúng ta sẽ có một resource có tên là `mysql01`, nó sử dụng `/dev/vg_centos7/lv_drbd` sử dụng như một lower-level device, được cấu hình với các meta-data. 253 | 254 | Nó sử dụng cổng TCP 7789 cho các kết nối mạng ở 2 địa chỉ IP của 2 node. Và hãy mở port này ở firewall. 255 | 256 | - Tạo tài nguyên DRBD 257 | 258 | ``` 259 | drbdadm create-md mysql01 260 | ``` 261 | 262 | - Kích hoạt tài nguyên 263 | 264 | ``` 265 | drbdadm up mysql01 266 | ``` 267 | 268 | - Sử dụng tài nguyên trên node 1 (Từ đây, chỉ chạy lệnh trên node1) 269 | 270 | ``` 271 | drbdadm primary --force mysql01 272 | ``` 273 | 274 | - Xem quá trình đồng bộ, xong sẽ chạy câu lệnh tiếp theo 275 | 276 | ``` 277 | drbd-overview 278 | 279 | 0:mysql01/0 Connected Primary/Secondary UpToDate/UpToDate 280 | 281 | ``` 282 | 283 | - Tạo filesystem cho DRBD với các tùy chọn sau: 284 | 285 | ``` 286 | mkfs.ext4 -m 0 -L drbd /dev/drbd0 287 | tune2fs -c 30 -i 180d /dev/drbd0 288 | ``` 289 | 290 | - Mount filesystem vừa tạo 291 | 292 | ``` 293 | mount /dev/drbd0 /mnt 294 | ``` 295 | 296 | 297 | #### 2.4.4 MariaDB 298 | 299 | Cài đặt MariaDB trên tất cả các node 300 | 301 | ``` 302 | yum install -y mariadb-server mariadb 303 | ``` 304 | 305 | Không cho khởi động cùng hệ thống, vì tí nữa chúng ta sẽ khai báo tài nguyên và quản lý bởi pacemaker 306 | 307 | ``` 308 | systemctl disable mariadb.service 309 | ``` 310 | 311 | ##### Thực hiện trên node 1 312 | 313 | Chúng ta khởi động MariaDB để cấu hình cơ bản 314 | 315 | ``` 316 | systemctl start mariadb 317 | ``` 318 | 319 | Khai báo trực tiếp với MariaDB qua câu lệnh 320 | 321 | ``` 322 | mysql_install_db --datadir=/mnt --user=mysql 323 | ``` 324 | 325 | Cấu hình cơ bản MariaDB 326 | 327 | ``` 328 | mysql_secure_installation 329 | ``` 330 | 331 | Khai báo policy vào SELinux về một số tùy chỉnh về thư mục lưu trữ dữ liệu của MariaDB, câu lệnh trên chúng ta đã thay đổi nó về `/mnt` . Mặc định các dữ liệu được lưu trữ tại `/var/lib/mysql`. 332 | 333 | ``` 334 | semanage fcontext -a -t mysqld_db_t "/mnt(/.*)?" 335 | restorecon -Rv /mnt 336 | ``` 337 | 338 | Sau khi hoàn thành các bước trên, chúng ta `umount` filesystem và stop MariaDB. 339 | 340 | ``` 341 | umount /mnt 342 | systemctl stop mariadb 343 | ``` 344 | 345 | Chúng ta sửa file cấu hình trên 2 node với nội dung như sau: 346 | 347 | ``` 348 | vi /etc/my.cnf 349 | ``` 350 | 351 | ``` 352 | [mysqld] 353 | symbolic-links=0 354 | bind_address = 0.0.0.0 355 | datadir = /var/lib/mysql 356 | pid_file = /var/run/mariadb/mysqld.pid 357 | socket = /var/run/mariadb/mysqld.sock 358 | 359 | [mysqld_safe] 360 | bind_address = 0.0.0.0 361 | datadir = /var/lib/mysql 362 | pid_file = /var/run/mariadb/mysqld.pid 363 | socket = /var/run/mariadb/mysqld.sock 364 | 365 | !includedir /etc/my.cnf.d 366 | ``` 367 | 368 | 369 | ### 2.5 Cấu hình Pacemaker 370 | 371 | Chúng ta sẽ cấu hình cho pacemaker tự động theo logic các dịch vụ như sau: 372 | 373 | - Khi Start: mysql_fs01 -> mysql_service01 -> mysql_VIP01 374 | - Khi Stop: mysql_VIP01 -> mysql_service01 -> mysql_fs01 375 | 376 | Trong đó: 377 | 378 | `mysql_fs01`: là tài nguyên filesystem 379 | `mysql_service01`: là dịch vụ MariaDB 380 | `mysql_VIP01`: là một Virtual IP ở bài viết tôi sử dụng 192.168.100.123 381 | 382 | Chúng ta cấu hình trên node thứ nhất của cụm (pcmk01): 383 | 384 | Tạo một CIB - lưu trữ và đồng bộ thông tin tài nguyên của các node 385 | 386 | ``` 387 | pcs cluster cib clust_cfg 388 | ``` 389 | 390 | Tắt STONITH và QUORUM: 391 | 392 | ``` 393 | pcs -f clust_cfg property set stonith-enabled=false 394 | pcs -f clust_cfg property set no-quorum-policy=ignore 395 | ``` 396 | 397 | Cấu hình thời để giảm downtime, tăng cường khả năng phục hồi: 398 | 399 | ``` 400 | pcs -f clust_cfg resource defaults resource-stickiness=200 401 | ``` 402 | 403 | Tạo một cụm tài nguyên có tên là `mysql-data01` cho DRDB và tạo một clone chạy đồng thời với nó 404 | 405 | ``` 406 | pcs -f clust_cfg resource create mysql_data01 ocf:linbit:drbd \ 407 | drbd_resource=mysql01 \ 408 | op monitor interval=30s 409 | ``` 410 | 411 | ``` 412 | pcs -f clust_cfg resource master MySQLClone01 mysql_data01 \ 413 | master-max=1 master-node-max=1 \ 414 | clone-max=2 clone-node-max=1 \ 415 | notify=true 416 | ``` 417 | 418 | Tạo một cụm cluster tài nguyên có tên là `mysql_fs01` cho filesystem. Và cấu hình cho các tài nguyên cùng chạy trên một node 419 | 420 | ``` 421 | pcs -f clust_cfg resource create mysql_fs01 Filesystem \ 422 | device="/dev/drbd0" \ 423 | directory="/var/lib/mysql" \ 424 | fstype="ext4" 425 | 426 | pcs -f clust_cfg constraint colocation add mysql_fs01 with MySQLClone01 \ 427 | INFINITY with-rsc-role=Master 428 | 429 | pcs -f clust_cfg constraint order promote MySQLClone01 then start mysql_fs01 430 | ``` 431 | 432 | Tương tự, chúng ta cũng tạo một tài nguyên `mysql_service01` cho MariaDB 433 | 434 | ``` 435 | pcs -f clust_cfg resource create mysql_service01 ocf:heartbeat:mysql \ 436 | binary="/usr/bin/mysqld_safe" \ 437 | config="/etc/my.cnf" \ 438 | datadir="/var/lib/mysql" \ 439 | pid="/var/lib/mysql/mysql.pid" \ 440 | socket="/var/lib/mysql/mysql.sock" \ 441 | additional_parameters="--bind-address=0.0.0.0" \ 442 | op start timeout=60s \ 443 | op stop timeout=60s \ 444 | op monitor interval=20s timeout=30s 445 | 446 | pcs -f clust_cfg constraint colocation add mysql_service01 with mysql_fs01 INFINITY 447 | 448 | pcs -f clust_cfg constraint order mysql_fs01 then mysql_service01 449 | ``` 450 | 451 | Cuối cùng, chúng ta tạo một cụm tài nguyên cho VIP với tên `mysql_VIP01` 452 | 453 | ``` 454 | pcs -f clust_cfg resource create mysql_VIP01 ocf:heartbeat:IPaddr2 \ 455 | ip=192.168.100.123 cidr_netmask=32 \ 456 | op monitor interval=30s 457 | ``` 458 | 459 | Cấu hình cho chạy trên 1 node và khởi động trước cụm tài nguyên `mysql_service01` 460 | 461 | ``` 462 | pcs -f clust_cfg constraint colocation add mysql_VIP01 with mysql_service01 INFINITY 463 | 464 | pcs -f clust_cfg constraint order mysql_service01 then mysql_VIP01 465 | ``` 466 | 467 | Kiểm tra lại những cấu hình 468 | 469 | ``` 470 | pcs -f clust_cfg constraint 471 | 472 | Location Constraints: 473 | Ordering Constraints: 474 | promote MySQLClone01 then start mysql_fs01 (kind:Mandatory) 475 | start mysql_fs01 then start mysql_service01 (kind:Mandatory) 476 | start mysql_service01 then start mysql_VIP01 (kind:Mandatory) 477 | Colocation Constraints: 478 | mysql_fs01 with MySQLClone01 (score:INFINITY) (with-rsc-role:Master) 479 | mysql_service01 with mysql_fs01 (score:INFINITY) 480 | mysql_VIP01 with mysql_service01 (score:INFINITY) 481 | ``` 482 | 483 | ``` 484 | pcs -f clust_cfg resource show 485 | 486 | Master/Slave Set: MySQLClone01 [mysql_data01] 487 | Stopped: [ pcmk01-cr pcmk02-cr ] 488 | mysql_fs01 (ocf::heartbeat:Filesystem): Stopped 489 | mysql_service01 (ocf::heartbeat:mysql): Stopped 490 | mysql_VIP01 (ocf::heartbeat:IPaddr2): Stopped 491 | ``` 492 | 493 | Áp dụng những thay đổi vừa cấu hình 494 | 495 | ``` 496 | pcs cluster cib-push clust_cfg 497 | ``` 498 | 499 | Xem trạng thái: 500 | 501 | ``` 502 | [pcmk01]# pcs status 503 | [...] 504 | 505 | Online: [ pcmk01-cr pcmk02-cr ] 506 | 507 | Full list of resources: 508 | 509 | Master/Slave Set: MySQLClone01 [mysql_data01] 510 | Masters: [ pcmk01-cr ] 511 | Stopped: [ pcmk02-cr ] 512 | mysql_fs01 (ocf::heartbeat:Filesystem): Started pcmk01-cr 513 | mysql_service01 (ocf::heartbeat:mysql): Started pcmk01-cr 514 | mysql_VIP01 (ocf::heartbeat:IPaddr2): Started pcmk01-cr 515 | 516 | [...] 517 | ``` 518 | 519 | 520 | 521 | ## 3. Tham khảo 522 | 523 | - Nguồn: https://www.lisenet.com/2016/activepassive-mysql-high-availability-pacemaker-cluster-with-drbd-on-centos-7/ -------------------------------------------------------------------------------- /HA-cho-MariaDB-tren-CentOS7/db-cent7.bash: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo -e "Huong dan cai dat: 4 | - Chuan bi: 5 | + SSH-Key cua node 2 voi ten 'node2' 6 | + Volume Group moi ten centos co dung luong lon hon 1GB 7 | + Khai bao thong tin vao file var.conf (IP, Node name, VIP, PASSWORD cua hacluster)" 8 | read -p "Bam ENTER de cai dat, CTRL + C de huy bo." 9 | 10 | source var.conf 11 | echo -e "\n$IP1 $HOST1 $HOST1-cr $HOST1-drbd 12 | $IP2 $HOST2 $HOST2-cr $HOST2-drbd 13 | $VIP pcmkvip" >> /etc/hosts 14 | scp -i node2 /etc/hosts root@$HOST2:/etc/ 15 | hostnamectl set-hostname $HOST1 16 | ssh -i node2 root@$HOST2 "hostnamectl set-hostname $HOST2" 17 | echo -e "net.ipv6.conf.all.disable_ipv6 = 1 18 | net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf 19 | scp -i node2 /etc/sysctl.conf root@$HOST2:/etc/ 20 | sysctl -p 21 | ssh -i node2 root@$HOST2 "sysctl -p" 22 | yum install -y pcs 23 | ssh -i node2 root@$HOST2 "yum install -y pcs" 24 | yum install -y policycoreutils-python 25 | ssh -i node2 root@$HOST2 "yum install -y policycoreutils-python" 26 | echo $PASSWORD | passwd hacluster --stdin 27 | ssh -i node2 root@$HOST2 "echo $PASSWORD | passwd hacluster --stdin" 28 | systemctl start pcsd.service && systemctl enable pcsd.service 29 | ssh -i node2 root@$HOST2 "systemctl start pcsd.service && systemctl enable pcsd.service" 30 | pcs cluster auth $HOST1 $HOST2 -u hacluster -p $PASSWORD --force 31 | pcs cluster setup --name mysql_cluster $HOST1 $HOST2 --force 32 | pcs cluster start --all 33 | 34 | #DRBD 35 | rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 36 | ssh -i node2 root@$HOST2 "rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org" 37 | rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm 38 | ssh -i node2 root@$HOST2 "rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm" 39 | yum install -y kmod-drbd84 drbd84-utils 40 | ssh -i node2 root@$HOST2 "yum install -y kmod-drbd84 drbd84-utils" 41 | semanage permissive -a drbd_t 42 | ssh -i node2 root@$HOST2 "semanage permissive -a drbd_t" 43 | 44 | # Chuan bi VG co ten 'centos' dung luong 1GB 45 | 46 | lvcreate --name lv_drbd --size 1024M centos 47 | ssh -i node2 root@$HOST2 "lvcreate --name lv_drbd --size 1024M centos" 48 | 49 | cat << EOL >/etc/drbd.d/mysql01.res 50 | resource mysql01 { 51 | protocol C; 52 | meta-disk internal; 53 | device /dev/drbd0; 54 | disk /dev/centos/lv_drbd; 55 | handlers { 56 | split-brain "/usr/lib/drbd/notify-split-brain.sh root"; 57 | } 58 | net { 59 | allow-two-primaries no; 60 | after-sb-0pri discard-zero-changes; 61 | after-sb-1pri discard-secondary; 62 | after-sb-2pri disconnect; 63 | rr-conflict disconnect; 64 | } 65 | disk { 66 | on-io-error detach; 67 | } 68 | syncer { 69 | verify-alg sha1; 70 | } 71 | on $HOST1 { 72 | address $IP1:7789; 73 | } 74 | on $HOST2 { 75 | address $IP2:7789; 76 | } 77 | } 78 | EOL 79 | scp -i node2 /etc/drbd.d/mysql01.res root@$HOST2:/etc/drbd.d/ 80 | drbdadm create-md mysql01 81 | ssh -i node2 root@$HOST2 "drbdadm create-md mysql01" 82 | drbdadm up mysql01 83 | ssh -i node2 root@$HOST2 "drbdadm up mysql01" 84 | drbdadm primary --force mysql01 85 | echo "Dang dong bo du lieu" 86 | a=`drbd-overview | grep -w "Connected"` 87 | while [ "$a" = "" ]; do sleep 10; a=`drbd-overview | grep -w "Connected"`; done; 88 | mkfs.ext4 -m 0 -L drbd /dev/drbd0 89 | tune2fs -c 30 -i 180d /dev/drbd0 90 | mount /dev/drbd0 /mnt 91 | 92 | ####### Cai dat MariaDB 93 | yum install -y mariadb-server mariadb 94 | ssh -i node2 root@$HOST2 "yum install -y mariadb-server mariadb" 95 | systemctl disable mariadb.service 96 | ssh -i node2 root@$HOST2 "systemctl disable mariadb.service" 97 | systemctl start mariadb 98 | mysql_install_db --datadir=/mnt --user=mysql 99 | semanage fcontext -a -t mysqld_db_t "/mnt(/.*)?" 100 | restorecon -Rv /mnt 101 | umount /mnt 102 | systemctl stop mariadb 103 | 104 | cat << EOL > /etc/my.cnf 105 | [mysqld] 106 | symbolic-links=0 107 | bind_address = 0.0.0.0 108 | datadir = /var/lib/mysql 109 | pid_file = /var/run/mariadb/mysqld.pid 110 | socket = /var/run/mariadb/mysqld.sock 111 | 112 | [mysqld_safe] 113 | bind_address = 0.0.0.0 114 | datadir = /var/lib/mysql 115 | pid_file = /var/run/mariadb/mysqld.pid 116 | socket = /var/run/mariadb/mysqld.sock 117 | 118 | !includedir /etc/my.cnf.d 119 | EOL 120 | scp -i node2 /etc/my.cnf root@$HOST2:/etc/ 121 | 122 | ### Cau hinh cluster 123 | 124 | pcs cluster cib clust_cfg 125 | pcs -f clust_cfg property set stonith-enabled=false 126 | pcs -f clust_cfg property set no-quorum-policy=ignore 127 | pcs -f clust_cfg resource defaults resource-stickiness=200 128 | 129 | pcs -f clust_cfg resource create mysql_data01 ocf:linbit:drbd drbd_resource=mysql01 op monitor interval=30s 130 | pcs -f clust_cfg resource master MySQLClone01 mysql_data01 master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true 131 | pcs -f clust_cfg resource create mysql_fs01 Filesystem device="/dev/drbd0" directory="/var/lib/mysql" fstype="ext4" 132 | pcs -f clust_cfg constraint colocation add mysql_fs01 with MySQLClone01 INFINITY with-rsc-role=Master 133 | pcs -f clust_cfg resource create mysql_service01 ocf:heartbeat:mysql binary="/usr/bin/mysqld_safe" config="/etc/my.cnf" datadir="/var/lib/mysql" pid="/var/lib/mysql/mysql.pid" socket="/var/lib/mysql/mysql.sock" additional_parameters="--bind-address=0.0.0.0" op start timeout=60s op stop timeout=60s op monitor interval=20s timeout=30s 134 | pcs -f clust_cfg constraint colocation add mysql_service01 with mysql_fs01 INFINITY 135 | pcs -f clust_cfg constraint order mysql_fs01 then mysql_service01 136 | pcs -f clust_cfg resource create mysql_VIP01 ocf:heartbeat:IPaddr2 ip=$VIP cidr_netmask=32 op monitor interval=30s 137 | pcs -f clust_cfg constraint colocation add mysql_VIP01 with mysql_service01 INFINITY 138 | pcs -f clust_cfg constraint order mysql_service01 then mysql_VIP01 139 | pcs -f clust_cfg constraint 140 | pcs -f clust_cfg resource show 141 | pcs cluster cib-push clust_cfg 142 | pcs status -------------------------------------------------------------------------------- /HA-cho-MariaDB-tren-CentOS7/var.conf: -------------------------------------------------------------------------------- 1 | export PASSWORD=abc@123 2 | export IP1=192.168.100.196 3 | export IP2=192.168.100.197 4 | export VIP=192.168.100.123 5 | export HOST1=node1 6 | export HOST2=node2 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Ghi chép về các kỹ thuật/giải pháp HA cho mysql/mariadb 2 | 3 | ### Mục lục: 4 | - [1. Giới thiệu về HA cho DB ](#1) 5 | - [2. Các giải giải pháp ](#2) 6 | - [2.1 Giải pháp có sẵn ](#2.1) 7 | - [2.1.1 Master - Slave ](#2.1.1) 8 | - [2.1.2 Master - Master ](#2.1.2) 9 | - [2.2 Giải pháp bên thứ 3 (3rd party) ](#2.2) 10 | - [2.2.1 Galera](#2.2.1) 11 | - [2.2.2 DRBD ](#2.2.2) 12 | - [2.2.3 Radundant Hardware ](#2.2.3) 13 | - [2.2.4 Shared Storage ](#2.2.4) 14 | - [2.2.5 MySQL clustering ](#2.2.5) 15 | - [2.2.6 Percona cluster ](#2.2.6) 16 | - [3. Kết luận ](#3) 17 | 18 | 19 | 20 | ## 1. Giới thiệu về HA 21 | 22 | Ngày nay, công nghệ thông tin đã ăn sâu vào nhiều lĩnh vực trong đời sống phục vụ cho sản xuất, giải trí và đặc biệt nhu cầu thông tin. Các hệ thống này luôn được đầu tư với quy mô càng ngày càng mở rộng, là hướng phát triển trọng tâm của doanh nghiệp cung cấp nội dung. Để đảm bảo các dịch vụ chạy thông suốt, phục vụ tối đa đến nhu cầu của người sử dụng và nâng cao tính bảo mật, an toàn dữ liệu; giải pháp High Availability được nghiên cứu và phát triển bởi nhiều hãng công nghệ lớn. Với Database, tính an toàn và khả dụng được đặt lên hàng đầu. Vì vậy, ở bài viết này, chúng tôi xin phép điểm qua một vài Giải pháp HA cho hệ cơ sở dữ liệu sử dụng MySQL hoặc MariaDB đang được cộng đồng tin dùng. 23 | 24 | ### HA giải quyết được gì? 25 | 26 | - Tăng tính hoạt động sẵn sàng dữ liệu mọi lúc mọi nơi 27 | - Nâng cao hiệu suất làm việc của hệ thống 28 | - Nâng cao được tính an toàn dữ liệu 29 | - Đảm bảo hệ thống làm việc không bị gián đoạn 30 | 31 | ## 2. Các giải pháp 32 | 33 | Có 2 giải pháp chính cho việc HA: 34 | 35 | - Giải pháp Native: Giải pháp này được mysql/mariadb hỗ trợ. 36 | - Master - Slave 37 | - Master - Master 38 | 39 | - Giải pháp 3rd party: Cùng với mục đích là để nhất quán dữ liệu với các server với nhau nhưng cơ chế hoạt động và mô hình khác với giải pháp Native. Một số kỹ thuật mà chúng tôi đã tìm hiểu là: 40 | - Galera 41 | - [DRBD](https://github.com/hoangdh/ghichep-drbd) 42 | 43 | 44 | 45 | ### 2.1 Giải pháp Native 46 | 47 | Cơ chế làm việc như sau: Trên mỗi server sẽ có một user làm nhiệm vụ replication dữ liệu mục đích của việc này là giúp các server đảm bảo tính nhất quán về dữ liệu với nhau. 48 | 49 | **Replication** là tính năng cho phép dữ liệu của (các) máy chủ Master được sao chép/nhân bản trên một hoặc nhiều máy chủ khác (Slave). Mục đích của việc này là để sao lưu dữ liệu ra các máy chủ khác đề phòng máy chủ chính gặp sự cố. 50 | 51 | **Có thể sao chép/nhân bản được những gì?** 52 | 53 | Tùy vào mục đích sử dụng, tính năng này cho phép chúng ta sao chép/nhân bản từ Tất cả các DB trên Master, một hoặc nhiều DB, cho đến các bảng trong mỗi DB sang Slave một cách tự động. 54 | 55 | **Cơ chế hoạt động** 56 | 57 | Máy chủ Master sẽ gửi các binary-log đến máy chủ Slave. Máy chủ Slave sẽ đọc các binary-log từ Master để yêu cầu truy cập dữ liệu vào quá trình replication. Một relay-log được tạo ra trên slave, nó sử dụng định dạng giống với binary-log. Các relay-log sẽ được sử dụng để replication và được xóa bỏ khi hoàn tất quá trình replication. 58 | 59 | Các master và slave không nhất thiết phải luôn kết nối với nhau. Nó có thể được đưa về trạng thái offline và khi được kết nối lại, quá trình replication sẽ được tiếp tục ở thời điểm nó offline. 60 | 61 | **Binary-log là gì?** 62 | 63 | Binary-log chứa những bản ghi ghi lại những thay đổi của các database. Nó chứa dữ liệu và cấu trúc của DB (có bao nhiêu bảng, bảng có bao nhiêu trường,...), các câu lệnh được thực hiện trong bao lâu,... Nó bao gồm các file nhị phân và các index. 64 | 65 | Binary-log được lưu trữ ở dạng nhị phân không phải là dạng văn bản plain-text. 66 | 67 | 68 | 69 | #### 2.1.1 Master - Slave 70 | **Master - Slave**: là một kiểu trong giải pháp HA cho DB, mục đích để đồng bộ dữ liệu của DB chính (Master) sang một máy chủ DB khác gọi là Slave một cách tự động. 71 | 72 | 73 | 74 | Tham khảo cách [cấu hình](docs/2-replica-master-slave.md). 75 | 76 | 77 | 78 | #### 2.1.2 Master - Master 79 | 80 | **Master - Master**: Khi cấu hình kiểu này, 2 DB sẽ tự động đồng bộ dữ liệu cho nhau. 81 | 82 | 83 | 84 | ## 2.2 Giải pháp 3rd party 85 | 86 | 87 | 88 | ### 2.2.1 Galera 89 | 90 | **Galera Cluster** là giải pháp tăng tính sẵn sàng cho cách Database bằng các phân phối các thay đổi (đọc - ghi dữ liệu) tới các máy chủ trong Cluster. Trong trường hợp một máy chủ bị lỗi thì các máy chủ khác vẫn sẵn sàng hoạt động phục vụ các yêu cầu từ phía người dùng. 91 | 92 | 93 | 94 | Cluster có 2 mode hoạt động là **Active - Passive** và **Active - Active**: 95 | 96 | - **Active - Passive**: Tất cả các thao tác ghi sẽ được thực hiện ở máy chủ Active, sau đó sẽ được sao chép sang các máy chủ Passive. Các máy chủ Passive này sẽ sẵn sàng đảm nhiệm vai trò của máy chủ Active khi xảy ra sự cố. Trong một vài trường hợp, **Active - Passive** cho phép `SELECT` ở các máy chủ Passive. 97 | - **Active - Active**: Thao tác đọc - ghi dữ liệu sẽ diễn ra ở mỗi node. Khi có thay đổi, dữ liệu sẽ được đồng bộ tới tất cả các node 98 | 99 | Hướng dẫn cài đặt trên: 100 | 101 | - [Ubuntu](https://github.com/hoangdh/ghichep-database/tree/master/Galera_on_Ubuntu) 102 | - [CentOS](https://github.com/hoangdh/ghichep-database/tree/master/Galera_on_CentOS) 103 | 104 | 105 | 106 | ### 2.2.2 DRBD (Distributed Replicated Block Device) 107 | 108 | #### Khái niệm/Định nghĩa 109 | 110 | - Phục vụ cho việc sao chép dữ liệu từ một thiết bị này sang thiết bị khác, đảm bảo dữ liệu luôn được đồng nhất giữa 2 thiết bị 111 | - Việc sao chép là liên tục do ánh xạ với nhau ở mức thời gian thực 112 | - Được ví như RAID 1 qua mạng 113 | - Bonus: [Bài viết chi tiết](https://github.com/hoangdh/ghichep-drbd) 114 | 115 | #### Nhiệm vụ của DRDB trong HA mysql/mariadb 116 | 117 | - Khi được cài đặt trên các cụm cluter, DRBD đảm nhiệm việc đồng bộ dữ liệu của các server trong cụm cluters với nhau 118 | 119 | #### Kết hợp với heartbeat 120 | 121 | - Là một tiện ích chạy ngầm trên máy master để kiểm tra trạng thái hoạt động. Khi máy master xảy ra sự cố, heartbeat sẽ khởi động các dịch vụ ở máy phụ để phục vụ thay máy master. 122 | 123 | 124 | 125 | 126 | ### 2.2.3 Radundant Hardware - Sử dụng tài nguyên phần cứng 127 | 128 | Thuật ngữ 'Two of Everything", nghĩa là sử dụng 2 tài nguyên phần cứng cho một máy chủ. Có nghĩa rằng một máy chủ sẽ có 2 nguồn cấp điện, 2 ổ cứng, 2 card mạng,... 129 | 130 | 131 | 132 | ### 2.2.4 Shared Storage 133 | 134 | Để khắc phục lại những sự cố mà server có thể gặp phải, một máy chủ backup được cấu hình nhằm mục đích sao lưu và duy trì các hoạt động khi server chính bị lỗi. Sử dụng NAS hoặc SAN bên trong các server để đồng bộ dữ liệu giữa các máy chủ với nhau. 135 | 136 | 137 | 138 | 139 | 140 | ### 2.2.5 MySQL clustering 141 | 142 | Với các Database lớn, clustering làm nhiệm vụ chia nhỏ dữ liệu và phân phối vào các server nằm ở bên trong cụm máy chủ cluster. Trong trường hợp một máy chủ bị lỗi, dữ liệu vẫn được lấy từ các node khác đảm bảo hoạt động của người dùng không bị gián đoạn. 143 | 144 | 145 | 146 | ### 2.2.6 Percona cluster 147 | 148 | Giống với Galera, Percona có ít nhất 3 node luôn đồng bộ dữ liệu với nhau. Dữ liệu có thể được đọc/ghi lên bất kỳ node nào trong mô hình. Một máy chủ đứng ở bên trên tiếp nhận các truy vấn và phân phối lại một cách đồng đều cho các server bên dưới. 149 | 150 | 151 | 152 | 153 | 154 | ### 3. Kết luận 155 | 156 | Nâng cao khả năng hoạt động cho cơ sở dữ liệu là điều vô cùng quan trọng, nó giúp các ứng dụng sử dụng DB của bạn hoạt động nhịp nhàng, trơn tru hơn. Trên đây là một vài giải pháp nâng cao hiệu năng hoạt động của DB. Dựa vào điều kiện thực tế mà có thể lựa chọn giải pháp phù hợp với mô hình của mình. 157 | -------------------------------------------------------------------------------- /db-cent7-2.bash: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo -e "Huong dan cai dat: 3 | - Chuan bi: 4 | + SSH-Key cua node 2 voi ten 'node2' 5 | + Volume Group moi ten centos co dung luong lon hon 1GB 6 | + Khai bao thong tin vao file var.conf (IP, Node name, VIP, PASSWORD cua hacluster)" 7 | read -p "Bam ENTER de cai dat, CTRL + C de huy bo." 8 | 9 | source var.conf 10 | echo -e "$IP1 $HOST1 $HOST1-cr $HOST1-drbd 11 | $IP2 $HOST2 $HOST2-cr $HOST2-drbd 12 | $VIP pcmkvip" >> /etc/hosts 13 | scp -i node2 /etc/hosts root@$HOST2:/etc/ 14 | hostnamectl set-hostname $HOST1 15 | ssh -i node2 root@$HOST2 "hostnamectl set-hostname $HOST2" 16 | ssh -i node2 root@$HOST2 17 | echo -e "net.ipv6.conf.all.disable_ipv6 = 1 18 | net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf 19 | scp -i node2 /etc/sysctl.conf root@$HOST2:/etc/ 20 | sysctl -p 21 | ssh -i node2 root@$HOST2 "sysctl -p" 22 | yum install -y pcs 23 | ssh -i node2 root@$HOST2 "yum install -y pcs" 24 | yum install -y policycoreutils-python 25 | ssh -i node2 root@$HOST2 "yum install -y policycoreutils-python" 26 | echo $PASSWORD | passwd hacluster --stdin 27 | ssh -i node2 root@$HOST2 "echo $PASSWORD | passwd hacluster --stdin" 28 | systemctl start pcsd.service && systemctl enable pcsd.service 29 | ssh -i node2 root@$HOST2 "systemctl start pcsd.service && systemctl enable pcsd.service" 30 | pcs cluster auth $HOST1-cr $HOST2-cr -u hacluster -p $PASSWORD 31 | pcs cluster setup --name mysql_cluster $HOST1-cr $HOST2-cr 32 | pcs cluster start --all 33 | 34 | #DRBD 35 | rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 36 | ssh -i node2 root@$HOST2 "rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org" 37 | rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm 38 | ssh -i node2 root@$HOST2 "rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm" 39 | yum install -y kmod-drbd84 drbd84-utils 40 | ssh -i node2 root@$HOST2 "yum install -y kmod-drbd84 drbd84-utils" 41 | semanage permissive -a drbd_t 42 | ssh -i node2 root@$HOST2 "semanage permissive -a drbd_t" 43 | 44 | ## Chuan bi VG co ten 'centos' dung luong 1GB 45 | 46 | lvcreate --name lv_drbd --size 1024M centos 47 | ssh -i node2 root@$HOST2 "lvcreate --name lv_drbd --size 1024M centos" 48 | 49 | cat << EOL >/etc/drbd.d/mysql01.res 50 | resource mysql01 { 51 | protocol C; 52 | meta-disk internal; 53 | device /dev/drbd0; 54 | disk /dev/centos/lv_drbd; 55 | handlers { 56 | split-brain "/usr/lib/drbd/notify-split-brain.sh root"; 57 | } 58 | net { 59 | allow-two-primaries no; 60 | after-sb-0pri discard-zero-changes; 61 | after-sb-1pri discard-secondary; 62 | after-sb-2pri disconnect; 63 | rr-conflict disconnect; 64 | } 65 | disk { 66 | on-io-error detach; 67 | } 68 | syncer { 69 | verify-alg sha1; 70 | } 71 | on $HOST1 { 72 | address $IP1:7789; 73 | } 74 | on HOST2 { 75 | address $IP2:7789; 76 | } 77 | } 78 | EOL 79 | scp -i node2 /etc/drbd.d/mysql01.res root@$HOST2:/etc/drbd.d/ 80 | drbdadm create-md mysql01 81 | ssh -i node2 root@$HOST2 "drbdadm create-md mysql01" 82 | drbdadm up mysql01 83 | ssh -i node2 root@$HOST2 "drbdadm up mysql01" 84 | drbdadm primary --force mysql01 85 | drbd-overview 86 | mkfs.ext4 -m 0 -L drbd /dev/drbd0 87 | tune2fs -c 30 -i 180d /dev/drbd0 88 | mount /dev/drbd0 /mnt 89 | 90 | # Cai dat MariaDB 91 | yum install -y mariadb-server mariadb 92 | ssh -i node2 root@$HOST2 "yum install -y mariadb-server mariadb" 93 | systemctl disable mariadb.service 94 | ssh -i node2 root@$HOST2 "systemctl disable mariadb.service" 95 | systemctl start mariadb 96 | mysql_install_db --datadir=/mnt --user=mysql 97 | semanage fcontext -a -t mysqld_db_t "/mnt(/.*)?" 98 | restorecon -Rv /mnt 99 | umount /mnt 100 | systemctl stop mariadb 101 | 102 | cat << EOL > /etc/my.cnf 103 | [mysqld] 104 | symbolic-links=0 105 | bind_address = 0.0.0.0 106 | datadir = /var/lib/mysql 107 | pid_file = /var/run/mariadb/mysqld.pid 108 | socket = /var/run/mariadb/mysqld.sock 109 | 110 | [mysqld_safe] 111 | bind_address = 0.0.0.0 112 | datadir = /var/lib/mysql 113 | pid_file = /var/run/mariadb/mysqld.pid 114 | socket = /var/run/mariadb/mysqld.sock 115 | 116 | !includedir /etc/my.cnf.d 117 | EOL 118 | scp -i node2 /etc/my.cnf root@$HOST2:/etc/ 119 | 120 | # Cau hinh cluster 121 | 122 | pcs cluster cib clust_cfg 123 | pcs -f clust_cfg property set stonith-enabled=false 124 | pcs -f clust_cfg property set no-quorum-policy=ignore 125 | pcs -f clust_cfg resource defaults resource-stickiness=200 126 | 127 | pcs -f clust_cfg resource create mysql_data01 ocf:linbit:drbd drbd_resource=mysql01 op monitor interval=30s 128 | pcs -f clust_cfg resource master MySQLClone01 mysql_data01 master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true 129 | pcs -f clust_cfg resource create mysql_fs01 Filesystem device="/dev/drbd0" directory="/var/lib/mysql" fstype="ext4" 130 | pcs -f clust_cfg constraint colocation add mysql_fs01 with MySQLClone01 INFINITY with-rsc-role=Master 131 | pcs -f clust_cfg resource create mysql_service01 ocf:heartbeat:mysql binary="/usr/bin/mysqld_safe" config="/etc/my.cnf" datadir="/var/lib/mysql" pid="/var/lib/mysql/mysql.pid" socket="/var/lib/mysql/mysql.sock" additional_parameters="--bind-address=0.0.0.0" op start timeout=60s op stop timeout=60s op monitor interval=20s timeout=30s 132 | pcs -f clust_cfg constraint colocation add mysql_service01 with mysql_fs01 INFINITY 133 | pcs -f clust_cfg constraint order mysql_fs01 then mysql_service01 134 | pcs -f clust_cfg resource create mysql_VIP01 ocf:heartbeat:IPaddr2 ip=$VIP cidr_netmask=32 op monitor interval=30s 135 | pcs -f clust_cfg constraint colocation add mysql_VIP01 with mysql_service01 INFINITY 136 | pcs -f clust_cfg constraint order mysql_service01 then mysql_VIP01 137 | pcs -f clust_cfg constraint 138 | pcs -f clust_cfg resource show 139 | pcs cluster cib-push clust_cfg 140 | pcs status -------------------------------------------------------------------------------- /docs/1-install-mysql-community-from-repository.md: -------------------------------------------------------------------------------- 1 | ## Cài đặt thông qua Repository của MySQL Community 2 | 3 | ### 1. Cài đặt Repository của MySQL 4 | 5 | ``` 6 | yum install -y yum-utils 7 | rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm 8 | ``` 9 | 10 | Trong ví dụ này, ta sẽ cài đặt MySQL bản 5.7. Mặc định, repo của bản 8.0 (mới nhất trong thời điểm viết bài) được kích hoạt. Do vậy, ta sẽ kích hoạt bản 5.7 và tắt bản 8.0. 11 | 12 | ``` 13 | yum-config-manager --disable mysql80-community 14 | yum-config-manager --enable mysql57-community 15 | ``` 16 | 17 | Kiểm tra lại thông tin của gói cài đặt `mysql-community-server` 18 | 19 | > yum info mysql-community-server.x86_64 20 | 21 | ### 2. Cài đặt MySQL 22 | 23 | Sau khi kích hoạt, ta sử dụng lệnh sau để cài đặt `mysql-community` bản 5.7 24 | 25 | > yum install -y mysql-community-server.x86_64 26 | 27 | Chờ khoảng 3-5p, tùy thuộc vào tốc độ mạng và cấu hình máy chủ của bạn. 28 | 29 | Khởi động và kích hoạt MySQL 30 | 31 | ``` 32 | systemctl start mysqld 33 | systemctl enable mysqld 34 | ``` 35 | 36 | ### 3. Cấu hình MySQL 37 | 38 | #### 3.1 Lấy mật khẩu tạm thời của `root` 39 | 40 | Từ bản 5.6, mỗi khi cài đặt mới thì mật khẩu của user `root` - quản trị của MySQL được lưu trữ trong log của MySQL tại `/var/log/mysqld.log` 41 | 42 | > grep -oP "temporary password(.*): \K(\S+)" /var/log/mysqld.log 43 | 44 | #### 3.2 Cấu hình cơ bản MySQL 45 | 46 | Sử dụng câu lệnh `mysql_secure_installation` để thay đổi mật khẩu root và xóa bỏ CSDL test, user test,... 47 | 48 | Đăng nhập bằng mật khẩu tạm thời và thay đổi mật khẩu với độ bảo mật cao (Bao gồm chữ HOA, chữ thường, số và một số ký tự đặc biệt) 49 | 50 | ``` 51 | # mysql_secure_installation 52 | 53 | Securing the MySQL server deployment. 54 | 55 | Enter password for user root: 56 | 57 | The existing password for the user account root has expired. Please set a new password. 58 | 59 | New password: 60 | 61 | Re-enter new password: 62 | The 'validate_password' plugin is installed on the server. 63 | The subsequent steps will run with the existing configuration 64 | of the plugin. 65 | Using existing password for root. 66 | 67 | Estimated strength of the password: 100 68 | Change the password for root ? ((Press y|Y for Yes, any other key for No) : n 69 | 70 | ... skipping. 71 | By default, a MySQL installation has an anonymous user, 72 | allowing anyone to log into MySQL without having to have 73 | a user account created for them. This is intended only for 74 | testing, and to make the installation go a bit smoother. 75 | You should remove them before moving into a production 76 | environment. 77 | 78 | Remove anonymous users? (Press y|Y for Yes, any other key for No) : y 79 | Success. 80 | 81 | 82 | Normally, root should only be allowed to connect from 83 | 'localhost'. This ensures that someone cannot guess at 84 | the root password from the network. 85 | 86 | Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y 87 | Success. 88 | 89 | By default, MySQL comes with a database named 'test' that 90 | anyone can access. This is also intended only for testing, 91 | and should be removed before moving into a production 92 | environment. 93 | 94 | 95 | Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y 96 | - Dropping test database... 97 | Success. 98 | 99 | - Removing privileges on test database... 100 | Success. 101 | 102 | Reloading the privilege tables will ensure that all changes 103 | made so far will take effect immediately. 104 | 105 | Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y 106 | Success. 107 | 108 | All done! 109 | ``` 110 | 111 | #### Sử dụng chính sách mật khẩu kém bảo mật 112 | 113 | Từ bản 5.6, MySQL mặc định sử dụng chính sách mật khẩu bảo mật ở mức cao, điều này dẫn tới nhiều rắc rối khi một số Tool tự động tạo user MySQL để cài đặt 'khốn đốn'. Để tắt tính năng này, ta sử dụng một trong những cách sau: 114 | 115 | - C1: Thêm vào file cấu hình `/etc/my.cnf` 116 | 117 | ``` 118 | [mysqld] 119 | ... 120 | validate_password_policy=LOW 121 | ... 122 | ``` 123 | 124 | - C2: Sử dụng câu lệnh 125 | 126 | > mysql -uroot -p -e "SET GLOBAL validate_password_policy=LOW" 127 | -------------------------------------------------------------------------------- /docs/2-replica-master-slave.md: -------------------------------------------------------------------------------- 1 | ## Cấu hình MySQL Replication Master - Slave 2 | 3 | MySQL replication là một tiến trình cho phép sao chép dữ liệu của MySQL một cách tự động từ máy chủ Master sang máy chủ Slave. Nó vô cùng hữu ích cho việc backup dữ liệu hoặc sử dụng để phân tích mà không cần thiết phải truy vấn trực tiếp tới CSDL chính hay đơn giản là để mở rộng mô hình. 4 | 5 | Bài lab này sẽ thực hiện với mô hình 2 máy chủ: 1 máy chủ master sẽ gửi thông tin, dữ liệu tới một máy chủ slave khác (Có thể chung hoặc khác hạ tầng mạng). Để thực hiện, trong ví dụ này sử dụng 2 IP: 6 | 7 | - IP Master: 10.10.10.1 8 | - IP Slave: 10.10.10.2 9 | 10 | ### 1. Cấu hình trên máy chủ Master 11 | 12 | #### Tạm dừng dịch vụ MySQL 13 | 14 | > systemctl stop mysqld 15 | 16 | #### Khai báo cấu hình cho Master 17 | 18 | Thêm các dòng sau vào file cấu hình `/etc/my.cnf` 19 | 20 | ``` 21 | [mysqld] 22 | ... 23 | bind-address=10.10.10.1 24 | log-bin=/var/lib/mysql/mysql-bin 25 | server-id=101 26 | ``` 27 | 28 | - `bind-address`: Cho phép dịch vụ lắng nghe trên IP. Mặc định là 127.0.0.1 - localhost 29 | - `log-bin`: Thư mục chứa log binary của MySQL, dữ liệu mà Slave lấy về thực thi công việc replicate. 30 | - `server-id`: Số định danh Server 31 | 32 | #### Khởi động dịch vụ MySQL 33 | 34 | > systemctl start mysqld 35 | 36 | Đăng nhập vào MySQL, tạo một user sử dụng trong quá trình replication 37 | 38 | > mysql -uroot -p 39 | 40 | ``` 41 | mysql> grant replication slave on *.* to replica@'10.10.10.2' identified by 'password'; 42 | 43 | Query OK, 0 rows affected (0.00 sec) 44 | mysql> flush privileges; 45 | 46 | ``` 47 | 48 | Khóa tất cả các bảng và dump dữ liệu 49 | 50 | ``` 51 | mysql> flush tables with read lock; 52 | mysql> show master status; 53 | 54 | +------------------+----------+--------------+------------------+-------------------+ 55 | | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | 56 | +------------------+----------+--------------+------------------+-------------------+ 57 | | mysql-bin.000001 | 592 | | | | 58 | +------------------+----------+--------------+------------------+-------------------+ 59 | 1 row in set (0.00 sec) 60 | 61 | ``` 62 | 63 | > **Chú ý**: Ghi nhớ thông tin này để khai báo khi [cấu hình trên Slave](#2) 64 | 65 | Mở một cửa sổ terminal khác để dump dữ liệu 66 | 67 | > \# mysqldump -u root -p --all-databases --lock-all-tables --events > mysql_dump.sql 68 | 69 | Quá trình dump hoàn thành, quay trở lại terminal trước để Unlock các bảng 70 | 71 | ``` 72 | mysql> unlock tables; 73 | mysql> exit 74 | ``` 75 | 76 | Chuyển dữ liệu vừa dump sang máy chủ slave. 77 | 78 | ### 2. Cấu hình máy chủ Slave 79 | 80 | Thêm các dòng sau vào file cấu hình `my.cnf` trên máy chủ Slave. Mục đích là định danh máy chủ slave và chỉ ra nơi lưu trữ bin-log. 81 | 82 | ``` 83 | [mysqld] 84 | ... 85 | log-bin=/var/lib/mysql/mysql-bin 86 | server-id=102 87 | ``` 88 | 89 | Khởi động lại MySQL 90 | 91 | > systemctl restart mysqld 92 | 93 | Khôi phục lại dữ liệu vừa dump trên Master. Ví dụ, file dump được copy về để ở thư mục /tmp 94 | 95 | > mysql -u root -p < /tmp/mysql_dump.sql 96 | 97 | Sau khi xong, đăng nhập vào MySQL để cấu hình Repilcate Master Slave 98 | 99 | > mysql -uroot -p 100 | 101 | ``` 102 | mysql> change master to 103 | -> master_host='10.10.10.1', 104 | -> master_user='replica', 105 | -> master_password='password', 106 | -> master_log_file='mysql-bin.000001', 107 | -> master_log_pos=592; 108 | mysql> start slave; 109 | mysql> show slave status\G 110 | ``` 111 | 112 | **Chú ý**: Điền thông tin `log_file` và `log_pos` trùng khớp với thông số mà ta đã lấy ở bước [trên](#1). 113 | 114 | 115 | ### Bonus 116 | 117 | Ghi binlog ở slave để có thể thiết lập slave khác từ Slave; sử dụng trong Mô hình Master-Master: 118 | 119 | ``` 120 | ... 121 | log_slave_updates = 1 122 | ``` 123 | 124 | -------------------------------------------------------------------------------- /docs/backup-mysql-to-minio-s3.md: -------------------------------------------------------------------------------- 1 | # Sao lưu và phục hồi dữ liệu MySQL lên S3 Minio sử dụng xbstream và xbcloud 2 | 3 | ## 1. Chuẩn bị 4 | 5 | - Percona Toolkit 6 | - MinIO 7 | 8 | ### Khai báo thông tin MinIO S3 cho xbcloud 9 | 10 | Thêm các thông tin MinIO tương ứng vào file `~/.my.cnf` 11 | 12 | > vim ~/.my.cnf 13 | 14 | ``` 15 | ... 16 | 17 | [xbcloud] 18 | storage=s3 19 | s3-endpoint=http://localhost:9000/ 20 | s3-access-key=minio 21 | s3-secret-key=minio123 22 | s3-bucket=backupsx 23 | s3-bucket-lookup=path 24 | s3-api-version=4 25 | ``` 26 | 27 | ## 2. Các bước thực hiện 28 | 29 | ### 2.1 Quá trình sao lưu (Backup) 30 | 31 | ``` 32 | THREADS=10 33 | CHUNKSIZE=200M 34 | HOST="$(hostname)-$(date -I)" 35 | 36 | xtrabackup --backup --stream=xbstream --parallel=$THREADS --read-buffer-size=$CHUNKSIZE --extra-lsndir=/data/tmp --target-dir=/data/tmp | xbcloud put --parallel=$THREADS $HOST 37 | ``` 38 | 39 | - Trong đó: 40 | - `THREADS`: Số luồng xtrabackup chạy 41 | - `CHUNKSIZE`: Xác định kích thước của object trên MinIO, mặc định: 10MB. 42 | - `HOST`: Tên thư mục được lưu trên MinIO,. Ví dụ: `mysql1-2022-04-27` 43 | - **Chú ý:** Có thể thêm các tùy chọn vào lệnh `xtrabackup`. Ví dụ: `--slave-info`: Nếu thực hiện trên máy chủ Slave; ... 44 | 45 | ### 2.2 Quá trình phục hồi (Restore) 46 | 47 | Quá trình này cần 2 bước thực hiện là lấy dữ liệu từ S3 MinIO và `apply-log` 48 | 49 | #### Lấy dữ liệu từ MinIO 50 | 51 | ``` 52 | THREADS=10 53 | HOST=mysql1-2022-04-27 54 | mkdir -p /data/restore-mysql/$HOST 55 | 56 | xbcloud get --parallel=$THREADS s3://backupsx/$HOST | xbstream -x --parallel=$THREADS -C /data/restore-mysql/$HOST 57 | ``` 58 | 59 | - Trong đó: 60 | - `backupsx`: Tên bucket 61 | - `HOST`: Tên thư mục sao lưu trên MinIO ở bước trên. 62 | 63 | #### Quá trình Apply-log 64 | 65 | ``` 66 | xtrabackup --prepare --use-memory=1G --apply-log-only --target-dir=/data/restore-mysql/$HOST 67 | ``` 68 | 69 | ## 3. Tham khảo 70 | 71 | - https://docs.percona.com/percona-xtrabackup/2.4/xbcloud/xbcloud.html 72 | -------------------------------------------------------------------------------- /docs/gtid-notes.md: -------------------------------------------------------------------------------- 1 | ### Khái niệm GTID 2 | 3 | GTID (Global Transaction Identifiers) được giới thiệu từ bản MySQL 5.6, 4 | - Là một mã định danh duy nhất khi một transaction được commmited trên máy chủ gốc (hay còn gọi là Master). 5 | - Mã định danh này tồn tại duy nhất trên toàn bộ các máy chủ MySQL (Bao gồm Master và các slave). 6 | - Giúp việc cấu hình Replicate đơn giản, dễ dàng; đảm bảo tính nhất quán và tin cậy. 7 | 8 | GTID bao gồm 2 phần: 9 | - ServerID: ID của Server, duy nhất theo dạng UUID. Được ghi vào file auto.conf khi khởi tạo MySQL; trong thư mục lưu trữ dữ liệu của MySQL. 10 | - TransactionID: Là ID của transaction; bắt đầu từ 1 và tăng dần theo thứ tự transaction. 11 | 12 | Ví dụ: `cef98fa3-5396-4ee0-85bb-cb1413d1531b:2135` 13 | 14 | ### Tính năng của GITD 15 | 16 | **Điểm khác nhau giữa GTID-based và log-based** 17 | 18 | - Với Log-based, Máy chủ Slave kêt nối tới Master sẽ phải khai báo file binlog và position. 19 | - Với GTID-based: 20 | - Trước hết, Slave sẽ gửi thông tin các GTID của các transaction đã được thực thi trên nó cho Master. Sau đó, Master sẽ gửi lại tất cả những transaction chưa được thực thi về Slave; Slave sẽ thực thi các transacction này. Và đảm bảo rằng chỉ thực hiện duy nhất một lần để đảm báo tính nhất quán dữ liệu. 21 | - Không cần sử dụng `MASTER_LOG_FILE` và `MASTER_LOG_POS`, chỉ cần khai báo `MASTER_AUTO_POSTION=1` 22 | - Khi sử dụng GITD, bắt buộc các máy chủ Slave cũng phải bật GITD 23 | - Tất cả các Slave phải ghi log; `log_slave_updates=1` 24 | 25 | ### Cách hoạt động 26 | - Khi một transaction được thực thi trên Master, một GTID được sinh ra, gắn tương ứng vào transaction rồi được ghi vào Binlog. 27 | - Binglog được Slave láy về lưu vào relay-log; Slave đọc GITD và gán giá trị vào biến `GTID_NEXT` để biết được GTID tiếp theo sẽ thực thi. 28 | - Tiến trình SQL thread trên Slave lấy giá trị GITD từ relay-log và so sánh với binlog. Nếu đã tồn tại, Slave sẽ bỏ qua. Nếu chưa, Slave sẽ thực thi và ghi chúng lại vào binlog của mình. 29 | 30 | ### Ưu điểm: 31 | 32 | - Cấu hình nhanh 33 | - Rút ngắn thời gian thao tác chuyển đổi dự phòng (Failover) 34 | - Tối ưu hơn với binlog là ROW 35 | 36 | ### Nhược điểm: 37 | 38 | - Khó trong việc xử lý khi lỗi xảy ra trên Slave (Không hỗ trợ slave_skip_counter, tuy nhiên có thao tác tương đương - bỏ qua transaction lỗi) 39 | - Không sử dụng được với MyISAM 40 | - Không hỗ trợ tạo bảng create table .. select; và bảng tạm (temporary) 41 | -------------------------------------------------------------------------------- /drafts/GALERA-setup-ubuntu.bash: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Add repo and setup MySQL Galera WSREP 4 | 5 | setup_Ubuntu() 6 | { 7 | apt-key adv --keyserver keyserver.ubuntu.com --recv 44B7345738EBDE52594DAD80D669017EBC19DDBA 8 | add-apt-repository 'deb [arch=amd64,i386] http://releases.galeracluster.com/ubuntu/ xenial main' 9 | debconf-set-selections <<< "mysql-server mysql-server/root_password password $PASSWORD" 10 | debconf-set-selections <<< "mysql-server mysql-server/root_password_again password $PASSWORD" 11 | apt-get update 12 | apt-get install -y galera-3 galera-arbitrator-3 mysql-wsrep-5.6 rsync 13 | } 14 | 15 | # Configuring the Galera 16 | 17 | configure_Galera() 18 | { 19 | 20 | sed -i '/bind-address/ s/^#*/#/g' /etc/mysql/my.cnf 21 | ufw allow 3306,4567,4568,4444/tcp 22 | ufw allow 4567/udp 23 | systemctl stop mysql 24 | } 25 | 26 | # Start the node 1 on Ubuntu 27 | 28 | start_node1_Ubuntu() 29 | { 30 | /etc/init.d/mysql start --wsrep-new-cluster 31 | mysql -uroot -p$PASSWORD -e "SHOW STATUS LIKE 'wsrep_cluster_size'" 32 | mysql -uroot -p$PASSWORD -e "update mysql.user set password=PASSWORD('03P8rdlknkXr1upf_H2') where User='debian-sys-maint';" 33 | } 34 | 35 | # Start the remain nodes on Ubuntu 36 | 37 | start_Ubuntu() 38 | { 39 | systemctl start mysql 40 | mysql -uroot -p$PASSWORD -e "update mysql.user set password=PASSWORD('03P8rdlknkXr1upf_H2') where User='debian-sys-maint';" 41 | mysql -uroot -p$PASSWORD -e "SHOW STATUS LIKE 'wsrep_cluster_size'" 42 | sleep 3 43 | } 44 | 45 | # Configuring the Debian Maintenance User 46 | 47 | create_DMU() 48 | { 49 | cat > /etc/mysql/debian.cnf << H2 50 | [client] 51 | host = localhost 52 | user = debian-sys-maint 53 | password = 03P8rdlknkXr1upf_H2 54 | socket = /var/run/mysqld/mysqld.sock 55 | [mysql_upgrade] 56 | host = localhost 57 | user = debian-sys-maint 58 | password = 03P8rdlknkXr1upf_H2 59 | socket = /var/run/mysqld/mysqld.sock 60 | basedir = /usr 61 | H2 62 | mysql -udebian-sys-maint -p03P8rdlknkXr1upf_H2 -e "SHOW STATUS LIKE 'wsrep_cluster_size'" 63 | sleep 3 64 | } 65 | 66 | run() 67 | { 68 | read -p "What node you want install Galera?: " NODE; 69 | case $NODE in 70 | 1) 71 | setup_Ubuntu 72 | configure_Galera $IP1 $NODE 73 | create_DMU 74 | start_node1_Ubuntu 75 | ;; 76 | 77 | 2) 78 | setup_Ubuntu 79 | configure_Galera $IP2 $NODE 80 | create_DMU 81 | start_Ubuntu 82 | ;; 83 | 84 | 3) 85 | setup_Ubuntu 86 | configure_Galera $IP3 $NODE 87 | create_DMU 88 | start_Ubuntu 89 | create_DMU 90 | ;; 91 | *) 92 | echo "Invaild input!" 93 | ;; 94 | esac 95 | } 96 | 97 | main() 98 | { 99 | file="conf.cfg" 100 | if [ -f "$file" ] 101 | then 102 | clear 103 | echo "$file found." 104 | . conf.cfg 105 | echo -e "--------INFO--------- 106 | Node1: $IP1 107 | Node2: $IP2 108 | Node3: $IP3 109 | Password: $PASSWORD 110 | ----------------------" 111 | run 112 | else 113 | echo Please fill info in file 'conf.cfg'! 114 | cat > conf.cfg << H2 115 | export PASSWORD=Abcdef@6789 116 | export IP1=1.1.1.1 117 | export IP2=2.2.2.2 118 | export IP3=3.3.3.3 119 | H2 120 | vi conf.cfg 121 | fi 122 | 123 | 124 | } 125 | 126 | main -------------------------------------------------------------------------------- /drafts/Hadoop-v1.mmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoangdh/ghichep-database/08b78429b4a29d58071c01a0317ea477311bdb7e/drafts/Hadoop-v1.mmap -------------------------------------------------------------------------------- /drafts/NNSv1.mmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoangdh/ghichep-database/08b78429b4a29d58071c01a0317ea477311bdb7e/drafts/NNSv1.mmap -------------------------------------------------------------------------------- /drafts/NNSv2.mmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoangdh/ghichep-database/08b78429b4a29d58071c01a0317ea477311bdb7e/drafts/NNSv2.mmap -------------------------------------------------------------------------------- /drafts/NNSv3.mmap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hoangdh/ghichep-database/08b78429b4a29d58071c01a0317ea477311bdb7e/drafts/NNSv3.mmap -------------------------------------------------------------------------------- /drafts/README-1.md: -------------------------------------------------------------------------------- 1 | # Galera Cluster với MySQL 2 | 3 | ## Giới thiệu 4 | 5 | **Galera Cluster** là giải pháp tăng tính sẵn sàng cho cách Database bằng các phân phối các thay đổi (đọc - ghi dữ liệu) tới các máy chủ trong Cluster. Trong trường hợp một máy chủ bị lỗi thì các máy chủ khác vẫn sẵn sàng hoạt động phục vụ các yêu cầu từ phía người dùng. 6 | 7 | Cluster có 2 mode hoạt động là **Active - Passive** và **Active - Active**: 8 | 9 | - **Active - Passive**: Tất cả các thao tác ghi sẽ được thực hiện ở máy chủ Active, sau đó sẽ được sao chép sang các máy chủ Passive. Các máy chủ Passive này sẽ sẵn sàng đảm nhiệm vai trò của máy chủ Active khi xảy ra sự cố. Trong một vài trường hợp, **Active - Passive** cho phép `SELECT` ở các máy chủ Passive. 10 | - **Active - Active**: Thao tác đọc - ghi dữ liệu sẽ diễn ra ở mỗi node. Khi có thay đổi, dữ liệu sẽ được đồng bộ tới tất cả các node 11 | 12 | Trong bài hướng dẫn này, chúng ta sẽ sử dụng mode **Active - Active** với mô hình 3 máy chủ. (Yêu cầu tối thiểu của Galera cluster) 13 | -------------------------------------------------------------------------------- /drafts/ghichepdb.md: -------------------------------------------------------------------------------- 1 | ## Ghi chép về các kỹ thuật/giải pháp HA cho mysql/mariadb 2 | 3 | ###Mục lục: 4 | [1. Giới thiệu về HA cho DB ](#1) 5 | 6 | [2. Giải pháp hỗ trợ sẵn ](#2) 7 | 8 | - [2.1 Giới thiệu về Replication ](#2.1) 9 | 10 | - [2.2 Các kiểu Replication ](#2.2) 11 | 12 | [2.2.1 Master - Slave ](#2.2.2) 13 | 14 | [2.2.2 Master - Master ](#2.2.2) 15 | 16 | [3. Giải pháp ngoài ](#3) 17 | 18 | - [3.1 Galera](#3.1) 19 | - [3.2 DRBD ](#3.2) 20 | 21 | [4. Kết luận ](#4) 22 | 23 | 24 | ### 1. Giới thiệu 25 | 26 | Ngày nay, công nghệ thông tin đã ăn sâu vào nhiều lĩnh vực trong đời sống phục vụ cho sản xuất, giải trí và đặc biệt nhu cầu thông tin. Các hệ thống này luôn được đầu tư với quy mô càng ngày càng mở rộng, là hướng phát triển trọng tâm của doanh nghiệp cung cấp nội dung. Để đảm bảo các dịch vụ chạy thông suốt, phục vụ tối đa đến nhu cầu của người sử dụng và nâng cao tính bảo mật, an toàn dữ liệu; giải pháp High Availability được nghiên cứu và phát triển bởi nhiều hãng công nghệ lớn. Với Database, tính an toàn và khả dụng được đặt lên hàng đầu. Vì vậy, ở bài viết này, chúng tôi xin phép điểm qua một vài Giải pháp HA cho hệ cơ sở dữ liệu sử dụng MySQL hoặc MariaDB đang được cộng đồng tin dùng. 27 | 28 | 29 | ### 2. Giải pháp hỗ trợ sẵn (Thuần túy không sử dụng sản phẩm của bên thứ 3) 30 | 31 | 32 | #### 2.1 Giới thiệu về Replication 33 | 34 | **Replication** là tính năng cho phép dữ liệu của (các) máy chủ Master được sao chép/nhân bản trên một hoặc nhiều máy chủ khác (Slave). Mục đích của việc này là để sao lưu dữ liệu ra các máy chủ khác đề phòng máy chủ chính gặp sự cố. 35 | 36 | **Có thể sao chép/nhân bản được những gì?** 37 | 38 | Tùy vào mục đích sử dụng, tính năng này cho phép chúng ta sao chép/nhân bản từ Tất cả các DB trên Master, một hoặc nhiều DB, cho đến các bảng trong mỗi DB sang Slave một cách tự động. 39 | 40 | **Cơ chế hoạt động** 41 | 42 | Máy chủ Master sẽ gửi các binary-log đến máy chủ Slave. Máy chủ Slave sẽ đọc các binary-log từ Mster để yêu cầu truy cập dữ liệu vào quá trình replication. Một relay-log được tạo ra trên slave, nó sử dụng định dạng giống với binary-log. Các relay-log sẽ được sử dụng để replication và được xóa bỏ khi hoàn tất quá trình replication. 43 | 44 | Các master và slave không nhất thiết phải luôn kết nối với nhau. Nó có thể được đưa về trạng thái offline và khi được kết nối lại, quá trình replication sẽ được tiếp tục ở thời điểm nó offline. 45 | 46 | **Binary-log là gì?** 47 | 48 | Binary-log chứa những bản ghi ghi lại những thay đổi của các database. Nó chứa dữ liệu và cấu trúc của DB (có bao nhiêu bảng, bảng có bao nhiêu trường,...), các câu lệnh được thực hiện trong bao lâu,... Nó bao gồm các file nhị phân và các index. 49 | 50 | Binary-log được lưu trữ ở dạng nhị phân không phải là dạng văn bản plain-text. 51 | 52 | 53 | #### 2.2 Các kiểu Replication 54 | 55 | 56 | ##### 2.2.1 Master - Slave 57 | **Master - Slave**: là một kiểu trong giải pháp HA cho DB, mục đích để đồng bộ dữ liệu của DB chính (Master) sang một máy chủ DB khác gọi là Slave một cách tự động. 58 | 59 | 60 | 61 | ###### 2.2.2 Master - Master 62 | 63 | **Master - Master**: Khi cấu hình kiểu này, 2 DB sẽ tự động đồng bộ dữ liệu cho nhau. 64 | 65 | 66 | 67 | 68 | #### 3 Giải pháp ngoài 69 | 70 | 71 | ##### 3.1 Galera 72 | 73 | **Galera Cluster** là giải pháp tăng tính sẵn sàng cho cách Database bằng các phân phối các thay đổi (đọc - ghi dữ liệu) tới các máy chủ trong Cluster. Trong trường hợp một máy chủ bị lỗi thì các máy chủ khác vẫn sẵn sàng hoạt động phục vụ các yêu cầu từ phía người dùng. 74 | 75 | 76 | 77 | Cluster có 2 mode hoạt động là **Active - Passive** và **Active - Active**: 78 | 79 | - **Active - Passive**: Tất cả các thao tác ghi sẽ được thực hiện ở máy chủ Active, sau đó sẽ được sao chép sang các máy chủ Passive. Các máy chủ Passive này sẽ sẵn sàng đảm nhiệm vai trò của máy chủ Active khi xảy ra sự cố. Trong một vài trường hợp, **Active - Passive** cho phép `SELECT` ở các máy chủ Passive. 80 | - **Active - Active**: Thao tác đọc - ghi dữ liệu sẽ diễn ra ở mỗi node. Khi có thay đổi, dữ liệu sẽ được đồng bộ tới tất cả các node 81 | 82 | 83 | ##### 3.2 DRBD (Distributed Replicated Block Device) 84 | 85 | 86 | Nguồn: https://mariadb.com/kb/en/mariadb/replication-overview/ 87 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /drafts/setup-centos-full.bash: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | setup_Centos() 4 | { 5 | yum -y install centos-release-scl-rh centos-release-scl 6 | sed -i -e "s/\]$/\]\npriority=10/g" /etc/yum.repos.d/CentOS-SCLo-scl.repo 7 | sed -i -e "s/\]$/\]\npriority=10/g" /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo 8 | yum --enablerepo=centos-sclo-rh -y install rh-mariadb101-mariadb-server 9 | scl enable rh-mariadb101 bash 10 | cat > /etc/profile.d/rh-mariadb101.sh << H2 11 | #!/bin/bash 12 | 13 | source /opt/rh/rh-mariadb101/enable 14 | export X_SCLS="`scl enable rh-mariadb101 'echo $X_SCLS'`" 15 | H2 16 | yum --enablerepo=centos-sclo-rh -y install rh-mariadb101-mariadb-server-galera 17 | # firewall-cmd --add-service=mysql --permanent 18 | # firewall-cmd --add-port={3306/tcp,4567/tcp,4568/tcp,4444/tcp} --permanent 19 | # firewall-cmd --reload 20 | systemctl restart rh-mariadb101-mariadb 21 | systemctl enable rh-mariadb101-mariadb 22 | mysql -uroot -p -e "UPDATE mysql.user SET Password=PASSWORD('$PASSWORD') WHERE User='root'; 23 | DELETE FROM mysql.user WHERE User=''; 24 | DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1'); 25 | DROP DATABASE IF EXISTS test; 26 | DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'; 27 | FLUSH PRIVILEGES;" 28 | systemctl restart rh-mariadb101-mariadb 29 | mysql -uroot -p$PASSWORD -e "show databases;" 30 | } 31 | 32 | configure_n1_centos() 33 | { 34 | mv /etc/opt/rh/rh-mariadb101/my.cnf.d/galera.cnf /etc/opt/rh/rh-mariadb101/my.cnf.d/galera.cnf.org 35 | cat > /etc/opt/rh/rh-mariadb101/my.cnf.d/galera.cnf << H2 36 | [galera] 37 | # Mandatory settings 38 | wsrep_on=ON 39 | wsrep_provider=/opt/rh/rh-mariadb101/root/usr/lib64/galera/libgalera_smm.so 40 | wsrep_cluster_address=gcomm:// 41 | 42 | binlog_format=row 43 | default_storage_engine=InnoDB 44 | innodb_autoinc_lock_mode=2 45 | bind-address=0.0.0.0 46 | 47 | wsrep_cluster_name="MariaDB_Cluster" 48 | wsrep_node_address="$1" 49 | wsrep_sst_method=rsync 50 | H2 51 | /opt/rh/rh-mariadb101/root/usr/bin/galera_new_cluster 52 | } 53 | 54 | configure_centos(){ 55 | mv /etc/opt/rh/rh-mariadb101/my.cnf.d/galera.cnf /etc/opt/rh/rh-mariadb101/my.cnf.d/galera.cnf.org 56 | cat > /etc/opt/rh/rh-mariadb101/my.cnf.d/galera.cnf << H2 57 | [galera] 58 | # Mandatory settings 59 | wsrep_on=ON 60 | wsrep_provider=/opt/rh/rh-mariadb101/root/usr/lib64/galera/libgalera_smm.so 61 | wsrep_cluster_address="gcomm://$IP1,$IP2,$IP3" 62 | 63 | binlog_format=row 64 | default_storage_engine=InnoDB 65 | innodb_autoinc_lock_mode=2 66 | bind-address=0.0.0.0 67 | 68 | wsrep_cluster_name="MariaDB_Cluster" 69 | wsrep_node_address="$1" 70 | wsrep_sst_method=rsync 71 | H2 72 | systemctl restart rh-mariadb101-mariadb 73 | } 74 | 75 | run() 76 | { 77 | for x in $IP1 $IP2 $IP3 78 | do 79 | tmp=$(ip a | grep -w "$x") 80 | if [ -n "$tmp" ] 81 | then 82 | IP=$x 83 | fi 84 | done 85 | list=`cat conf.cfg` 86 | for i in $list 87 | do 88 | y=`echo $i | grep -w "$IP"` 89 | if [ -n "$y" ] 90 | then 91 | NODE=`echo $y | awk -F = '{print $1}' | awk -F P {'print $2'}` 92 | fi 93 | done 94 | if [ -n "$NODE" ] && [ -n "$IP" ] 95 | then 96 | echo "NODE $NODE has IP address: $IP" 97 | 98 | case $NODE in 99 | 1) 100 | setup_Centos 101 | configure_n1_centos $IP 102 | ;; 103 | 104 | *) 105 | setup_Centos 106 | configure_centos $IP 107 | ;; 108 | esac 109 | else 110 | echo "Invaild node!" 111 | fi 112 | } 113 | 114 | main() 115 | { 116 | file="conf.cfg" 117 | if [ -f "$file" ] 118 | then 119 | clear 120 | echo "$file found." 121 | . conf.cfg 122 | echo -e "--------INFO--------- 123 | Node1: $IP1 124 | Node2: $IP2 125 | Node3: $IP3 126 | Password: $PASSWORD 127 | ----------------------" 128 | run 129 | else 130 | echo Please fill info in file 'conf.cfg'! 131 | read -p "Enter IP Node 1: " IP1 132 | read -p "Enter IP Node 2: " IP2 133 | read -p "Enter IP Node 3: " IP3 134 | read -p -s "Enter password for MySQL's root: " pass1 135 | while true 136 | do 137 | read -p -s $'\Re-Enter password for MySQL\'s root: ' pass2 138 | if [ "$pass1" = "$pass2" ] 139 | then 140 | break 141 | else 142 | echo "Not match!" 143 | fi 144 | done 145 | 146 | cat > conf.cfg << H2 147 | export PASSWORD=$pass2 148 | export IP1=$IP1 149 | export IP2=$IP2 150 | export IP3=$IP3 151 | H2 152 | fi 153 | 154 | } 155 | 156 | main --------------------------------------------------------------------------------