|
Viết bởi canh_nguyen
|
Có nhiều kiểu cấu hình replicate, tùy từng trường hợp cụ thể mà sử dụng theo cách nào cho phù hợp.
Ở đây trường hợp của tôi, bài tóan đặt ra như sau :
Code+database website được đặt trên 2 server (1 trong nước, 1 nước ngoài ). Yêu cầu 2 database này phải được đồng bộ thường xuyên với nhau.
Lí do tôi chọn cách cấu hình master to master là bởi thế, với cấu hình này thì 1 server vừa là master vừa là slave, tức nó vừa lắng nghe vừa ra hiệu cho server còn lại nếu có sự thay đổi dữ liệu trong database.
Cả 2 server sử dụng hệ điều hành CentOs, database MySQL version 5.x
Server 1 có IP dạng : 192.168.1.10
Server 2 có IP dạng : 192.168.1.11
Đăng nhập vào chế độ dòng lệnh của MySQL:
$ mysql -u root -p
Thực thi câu lệnh tương tự cho cả 2 server :
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%' IDENTIFIED BY '%slave_password%';
FLUSH PRIVILEGES;
quit;
Trong đó replication là user,slave_password là mật khẩu của user replication.
Edit file my.cnf của server 1 :
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
#user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
max_connections = 400
key_buffer = 16M
myisam_sort_buffer_size = 32M
join_buffer_size = 1M
read_buffer_size = 1M
sort_buffer_size = 2M
table_cache = 1024
thread_cache_size = 286
interactive_timeout = 25
wait_timeout = 1000
connect_timeout = 60
max_allowed_packet = 16M
max_connect_errors = 10
query_cache_limit = 1M
query_cache_size = 16M
query_cache_type = 1
tmp_table_size = 16M
skip-innodb
log-bin=mysql-bin
binlog-do-db=replicate_test
binlog-ignore-db=mysql
binlog-ignore-db=test
server-id=1
master-host = 192.168.2.11
master-user = replication
master-password = 111111
master-port = 3306
auto_increment_increment= 2
auto_increment_offset = 2
slave-net-timeout = 30
master-connect-retry = 30
[mysql.server]
user=mysql
basedir=/var/lib
[mysqld_safe]
relay-log = relay-bin
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
max_allowed_packet = 16M
[myisamchk]
keybuffer = 32M
sort_buffer = 32M
read_buffer = 16M
write_buffer = 16M
Edit file my.cnf của server 2 :
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
#user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
max_connections = 400
key_buffer = 16M
myisam_sort_buffer_size = 32M
join_buffer_size = 1M
read_buffer_size = 1M
sort_buffer_size = 2M
table_cache = 1024
thread_cache_size = 286
interactive_timeout = 25
wait_timeout = 1000
connect_timeout = 60
max_allowed_packet = 16M
max_connect_errors = 10
query_cache_limit = 1M
query_cache_size = 16M
query_cache_type = 1
tmp_table_size = 16M
skip-innodb
log-bin=mysql-bin
binlog-do-db=replicate_test
binlog-ignore-db=mysql
binlog-ignore-db=test
server-id=2
master-host = 192.168.2.10
master-user = replication
master-password = 111111
master-port = 3306
auto_increment_increment= 2
auto_increment_offset = 2
slave-net-timeout = 30
master-connect-retry = 30
[mysql.server]
user=mysql
basedir=/var/lib
[mysqld_safe]
relay-log = relay-bin
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
max_allowed_packet = 16M
[myisamchk]
keybuffer = 32M
sort_buffer = 32M
read_buffer = 16M
write_buffer = 16M
Bạn cần để ý các thông số sau ở cả 2 server :
log-bin=mysql-bin
binlog-do-db=replicate_test
binlog-ignore-db=mysql
binlog-ignore-db=test
server-id=2
master-host = 192.168.2.10
master-user = replication
master-password = 111111
master-port = 3306
auto_increment_increment= 2
auto_increment_offset = 2
Chú thích các thông số :
binlog-do-db=replicate_test : chỉ định các bảng sẽ được thực hiện replicate
binlog-ignore-db=mysql : Chỉ định các bảng sẽ không được thực hiện replicate
server-id : Id chỉ định cho server.
master-host : Địa chỉ ip của host master
master-user,master-password : user và password theo master-host
master-port: cổng truy vấn của database.
auto_increment_offset : cần đặc biệt chú ý thông số này, trường hợp bạn không thiết lập thông số này database có trường autoincrement sẽ tăng theo giá trị +1 cho giá trị tiếp theo khi insert dữ liệu mới.
Để tránh trường hợp 2 database ở 2 server bị trùng giá trị autoincrement tôi đặt giá trị này auto_increment_offset=1 cho server1 và =2 cho server 2 với mục đích giá trị tự động tăng ở server1 là số lẻ , ở server 2 là số chẵn.
Đăng nhập chế độ dòng lệnh MySQL và thực hiện việc gán master cho server2:
stop slave;
CHANGE MASTER TO MASTER_HOST='192.168.1.10', MASTER_USER='replication', MASTER_PASSWORD='%slave_password%';
start slave;
Thực hiện câu lệnh tương tự cho server 1 với MASTER_HOST là 192.168.1.11, user và password.
Kiểm tra sự hoạt động của cả 2 server :
SHOW MASTER STATUS;
SHOW SLAVE STATUS\G;
Nếu 2 option Slave_IO_Running and Slave_SQL_Running đều hiển thị Yes thì bạn đã thành công.
Nếu 1 trong 2 chưa thành công bạn cần kiểm tra lại user và password chính xác, hoặc master-port đã được mở hay chưa.
Tham khảo thêm về replicate MySQL : http://dev.mysql.com/doc/refman/5.1/en/replication-howto.html
|