此例以最简明的方式说明MySQL主从复制的配置方法,
此处有2个mysql实例,my1,my2
修改各自的my.ini配置文件
在[mysqld]区域中
主从实例共同配置点:
1,增加实例标致
server-id=x x
为整数,每个mysql实例各不相同
2,要实现主从复制需要改为mysql备份方式修改(或增加)
log-bin=mysql-bin 指定使用mysql二进制方式进行复制,此步为必须配置.
以上两个为共同点,不同点为:
3,对于主MySQL实例(my1),需要指定有哪些数据库需要备份
binlog-do-db=mydb
对于从MySQL实例(my2),需要指定去哪个主MySQL中去复制哪些内容
master-host=xxx
master-user=xx
master-password=***
master-port=xxxx
master-connect-retry=60 这个数字可以自己定
replicate-do-db=test 复制哪个数据库
log-slave-updates
以上为MySQL主从复制的基本方式,通过以上的配置,从mysql已经可以正常复制了。
登录从Mysql,
mysql>show slave
status\G;
*************************** 1.
row ***************************
Slave_IO_State: Waiting for master to
send event
Master_Host: localhost
Master_User: root
Master_Port: 3310
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 98
Relay_Log_File: win7-PC-relay-bin.000009
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: test
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 98
Relay_Log_Space: 235
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.00 sec)
可以看出,从MySQL已经开始工作了,现在可以去主MySQL中增加一个表,看看从MySQL中有没有。
大家在网上都能找到都是RedHat系统等等,对Ubuntu系统MySQL集群就没有介绍文章
我现在写写Ubuntu这个MySQL集群方法。新手不要骂我,呵呵。
介绍网络环境:
测试环境:
Server1: ndbd 192.168.245.11
Server2: ndbd 192.168.245.12
Server3: mysqld –ndb-cluster 192.168.245.13
ndbd: 数据库节点。
mysqld –ndb-cluster: MySQL服务器节点,程序直接访问的是这台机器的IP。默认端口仍是3306。
ndbd_mgm ndbd_mgmd:管理节点。管理/查看各库节点和服务器节点的状态。
二、集群方案
1.管理节点:server3(192.168.245.13)
2.存储节点:server1(192.168.245.11),server2(192.168.245.12)
3.SQL节点:server1(192.168.245.11),server2(192.168.245.12),server3(192.168.245.13)
三、mysql安装和配置
1.安装,sudo apt-get install mysql-server
2.配置这三台服务器上配置my.cnf,这三台服务器都要配置
vim /etc/mysql/my.cnf
—————————————–my.cnf开始——————————————–
Ubuntu@ubuntu:~$ cat /etc/mysql/my.cnf
#
# The MySQL database server configuration file.
#
# You can copy this to one of:
# - “/etc/mysql/my.cnf” to set global options,
# - “~/.my.cnf” to set user-specific options.
#
# One can use all long options that the program supports.
# Run program with –help to get a list of available options and with
# –print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/serve ... ables.html
# This will be passed to all mysql clients
# It has been reported that passwords should be enclosed with ticks/quotes
# escpecially if they contain “#” chars…
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.
[client]
port=3306
socket= /var/run/mysqld/mysqld.sock
# Here is entries for some specific programs
# The following values assume you have at least 32M ram
# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
socket= /var/run/mysqld/mysqld.sock
nice=0
[mysqld]
#
# * Basic Settings
#
#
# * IMPORTANT
# If you make changes to these settings and your system uses apparmor, you may
# also need to also adjust /etc/apparmor.d/usr.sbin.mysqld.
#
user=mysql
pid-file= /var/run/mysqld/mysqld.pid
socket= /var/run/mysqld/mysqld.sock
port=3306
basedir= /usr
datadir= /var/lib/mysql
tmpdir= /tmp
language= /usr/share/mysql/english
skip-external-locking
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address=127.0.0.1
#
# * Fine Tuning
#
key_buffer=16M
max_allowed_packet=16M
thread_stack=128K
thread_cache_size=8
#max_connections=100
#table_cache=64
#thread_concurrency=10
#
# * Query Cache Configuration
#
query_cache_limit=1M
query_cache_size=16M
#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
#log= /var/log/mysql/mysql.log
#
# Error logging goes to syslog. This is a Debian improvement
#
# Here you can see queries with especially long duration
#log_slow_queries= /var/log/mysql/mysql-slow.log
#long_query_time=2
#log-queries-not-using-indexes
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
# other settings you may need to change.
#server-id=1
#log_bin= /var/log/mysql/mysql-bin.log
expire_logs_days=10
max_binlog_size=100M
#binlog_do_db=include_database_name
#binlog_ignore_db=include_database_name
#
# * BerkeleyDB
#
# Using BerkeleyDB is now discouraged as its support will cease in 5.1.12.
skip-bdb
#
# * MyISAM
#
# MyISAM is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more MyISAM related options. There are many!
# You might want to disable MyISAM to shrink the mysqld process by circa 100MB.
#skip-innodb
#
# * Security Features
#
# Read the manual, too, if you want chroot!
#chroot= /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI “tinyca”.
#
#ssl-ca=/etc/mysql/cacert.pem
#ssl-cert=/etc/mysql/server-cert.pem
#ssl-key=/etc/mysql/server-key.pem
ndbcluster
ndb-connectstring=192.168.245.13
[mysqldump]
quick
quote-names
max_allowed_packet=16M
[mysql]
#no-auto-rehash # faster start of mysql but no tab completition
[isamchk]
key_buffer=16M
#
# * NDB Cluster
#
# See /usr/share/doc/mysql-server-*/README.Debian for more information.
#
# The following configuration is read by the NDB Data Nodes (ndbd processes)
# not from the NDB Management Nodes (ndb_mgmd processes).
#
[MYSQL_CLUSTER]
ndb-connectstring=192.168.245.13
#
# * IMPORTANT: Additional settings that can override those from this file!
# The files must end with ‘.cnf’, otherwise they’ll be ignored.
#
!includedir /etc/mysql/conf.d/
Ubuntu@ubuntu:~$
———————————my.cnf结束———————————————————
主要在:[mysqld]下添加:
ndbcluster
ndb-connectstring=192.168.245.13
和添加
[MYSQL_CLUSTER]
ndb-connectstring=192.168.245.13
上面三台服务器都要一样
2.配置ndb_mgmd.cnf(192.168.245.13服务器上配置)
复制/usr/share/doc/mysql-server-5.0/examples/ndb_mgmd.cnf到/etc/mysql/ndb_mgmd.cnf
编辑ndb_mgmd.cnf
——————-开始————
Ubuntu@ubuntu:~$ cat /etc/mysql/ndb_mgmd.cnf
[NDBD DEFAULT]
NoOfReplicas=2
DataMemory=10MB
IndexMemory=25MB
MaxNoOfTables=256
MaxNoOfOrderedIndexes=256
MaxNoOfUniqueHashIndexes=128
[MYSQLD DEFAULT]
[NDB_MGMD DEFAULT]
[TCP DEFAULT]
[NDB_MGMD]
Id=1# the NDB Management Node (this one)
HostName=192.168.245.13
DataDir= /var/lib/mysql-cluster
[NDBD]
Id=2# the first NDB Data Node
HostName=192.168.245.11
DataDir= /var/lib/mysql-cluster
[NDBD]
Id=3# the second NDB Data Node
HostName=192.168.245.12
DataDir=/var/lib/mysql-cluster
[MYSQLD]
Id=4# the first SQL node
HostName=192.168.245.13
[MYSQLD]
Id=5# the first SQL node
HostName=192.168.245.11
[MYSQLD]
Id=6# the first SQL node
HostName=192.168.245.12
Ubuntu@ubuntu:~$
——————-结束————
先启动:
13服务器:
sudo /etc/init.d/mysql-ndb-mgm start
然后启动
11.12服务器
sudo /etc/init.d/mysql-ndb start
最后启动,13.11.12服务器mysql服务
sudo /etc/init.d/mysql start
测试:
13服务器上:
neo@mgm:~$ ndb_mgm
– NDB Cluster — Management Client –
ndb_mgm>show
Connected to Management Server at: localhost:1186
Cluster Configuration
———————
[ndbd(NDB)] 2 node(s)
id=2@192.168.245.11 (Version: 5.0.51, Nodegroup: 0)
id=3@192.168.245.12 (Version: 5.0.51, Nodegroup: 0, Master)
[ndb_mgmd(MGM)] 1 node(s)
id=1@192.168.245.13 (Version: 5.0.51)
[mysqld(API)] 2 node(s)
id=4@192.168.245.13 (Version: 5.0.51)
id=5@192.168.245.11 (Version: 5.0.51)
id=5@192.168.245.12 (Version: 5.0.51)
ndb_mgm>
与没有使用簇的MySQL相比,在MySQL簇内操作数据的方式没有太大的区别。
执行这类操作时应记住三点
1.表必须用ENGINE=NDB或ENGINE=NDBCLUSTER选项创建,或用ALTER TABLE选项更改,以使用NDB
Cluster存储引擎在
Cluster内复制它们。如果使用mysqldump的输出从已有数据库导入表,可在文本编辑器中打开SQL脚本,并将该选项添加到任何表创建语句,或
用这类选项之一替换任何已有的ENGINE(或TYPE)选项。
2.另外还请记住,每个NDB表必须有一个主键。如果在创建表时用户未定义主键,NDB
Cluster存储引擎将自动生成隐含的主键。(注释:该隐含
键也将占用空间,就像任何其他的表索引一样。由于没有足够的内存来容纳这些自动创建的键,出现问题并不罕见)。
3.当你在一个节点上运行create database mydb;你去其他sql node上执行show
databases;将不能看到mydb,你需要创建它,然后use mydb; show tables;你将看到同步的表。
SQL Node 1
neo@sql:~$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 7
Server version: 5.0.51a-3Ubuntu5.1 (Ubuntu)
Type ‘help;’ or ‘h’ for help. Type ‘c’ to clear the buffer.
mysql>create database cluster;
Query OK, 1 row affected (0.00 sec)
mysql>use cluster
Database changed
mysql>create table city( id mediumint unsigned not null auto_increment primary key,
name varchar(20) not null default ” )engine=ndbclusterdefault
charset utf8;
Query OK, 0 rows affected (1.07 sec)
mysql>insert into city values(1, ‘Shenzhen’);
Query OK, 1 row affected (0.12 sec)
mysql>insert into city values(2, ‘Guangdong’);
Query OK, 1 row affected (0.00 sec)
SQL Node 2
neo@sql:~$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 7
Server version: 5.0.51a-3Ubuntu5.1 (Ubuntu)
Type ‘help;’ or ‘h’ for help. Type ‘c’ to clear the buffer.
mysql>show databases;
——————–
| Database |
——————–
| information_schema |
| example |
| mydb |
| mysql |
| neo |
——————–
6 rows in set (0.13 sec)
mysql>create database cluster;
Query OK, 1 row affected (0.00 sec)
mysql>show databases;
——————–
| Database |
——————–
| information_schema |
| cluster |
| example |
| mydb |
| mysql |
| neo |
——————–
6 rows in set (0.13 sec)
mysql>use cluster;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql>show tables;
——————-
| Tables_in_cluster |
——————-
| city |
——————-
1 row in set (0.01 sec)
mysql>select * from city;
—- ———–
| id | name |
—- ———–
| 1 | Shenzhen |
| 2 | Guangdong |
—- ———–
2 rows in set (0.03 sec)
mysql>
项目中使用mysql 主从复制,但是用程序实现的读写分离,代码片段如下:
1
public DataSource getDataSource(MethodType
methodType) {2
if (methodType == MethodType.WRITE)
{3
return getDataSource(MasterDataSources);4
} else
{5
return getDataSource(SlaveDataSources);6
}7
}
获取数据源,首先你要确定MethodType 类型,一个是读,一个是写
1
public enum MethodType
{2
READ,
WRITE3}
读是获取从库数据源,写是获取主库数据源。
这样,就需要在jdbc配置配置两个数据源(一主一从)
还有另一种实现方式,不用程序来控制。mysql 驱动包提供相应的实现
com.mysql.jdbc.ReplicationDriver.
我写了一个简单的例子:
1
package com.howard.loadbalance;2
3
import java.sql.Connection;4
import java.sql.ResultSet;5
import java.sql.SQLException;6
import java.sql.Statement;7
import java.util.Properties;8
import java.util.concurrent.ExecutorService;9
import java.util.concurrent.Executors;10
11
import org.slf4j.Logger;12
import org.slf4j.LoggerFactory;13
14
import com.mysql.jdbc.ReplicationDriver;15
16
public class MysqlTest
{17
18
public static class QueryRunnable implements Runnable
{19
20
protected final static Logger
logger = LoggerFactory21
.getLogger(QueryRunnable.class);2223
@Override24
public void run()
{25
logger.info("user
size: " + this.query());26 }27
28
public int query()
{29
int count =
0;30
try
{31
ReplicationDriver
driver = new ReplicationDriver();32 Properties props
= new Properties();33 props.put("roundRobinLoadBalance",
"true");34 props.put("autoReconnect",
"true");35 props.put("user",
"core");36 props.put("password",
"core");37 Connection conn
= null;38 Statement stat
= null;39 ResultSet res
= null;40
try
{41
conn = driver42
.connect(43 //注意url串中间不要有空格,因为mysql源码对多个地址split时没有trim.44
"jdbc:mysql:replication://127.0.0.1:3309,127.0.0.1:3306/core",
45
props);46 //读写分离标记47
//当设置true时,只会在从库查询数据48
//当设置false时,会在主库做更新删除操作49
//
conn.setReadOnly(true);50 stat =
conn.createStatement();51 res = stat.executeQuery("select
count(1) from c_user");52 while (res.next())53
count = res.getInt(1);54
} finally
{55
if (res
!= null)56
res.close();57 if (stat != null)58
stat.close();59 if (conn != null)60
conn.close();61 }62
} catch (SQLException e)
{63
e.printStackTrace();64 }65
return count;66
}67
}68
69
public static void main(String[] args)
{70
// 创建线程池测试负载军衡71
ExecutorService service = Executors.newCachedThreadPool();72
for (int
i = 0; i
< 10;
i++) {73
service.execute(new
QueryRunnable());74 }75
service.shutdown();76 }77
78
}79
第一種方法:當後端MYSQL服務器群是master-master雙向同步機制時,前端應用使用JDBC連接數據庫可以使用loadbalance方式,如下所示:
jdbc:mysql:loadbalance://dbnode_1:port,dbnode_2:port,dbnode_3:port,dbnode_n:port/dbname?user=xxxx;password=xxxxxxx;loadBalanceBlacklistTimeout=3000;&characterEncoding=utf-8
loadbalance方式有兩種負載均衡算法,一種是隨機式的輪詢算法,另一種是最短響應時間算法,具體會使用哪種算法、怎 人為指定使用哪種算法目前還不太清楚。。官方網站上也沒看到很明確的說明。
第二種方法:
當後端MYSQL服務器群是master-slave單向一主N
從的同步複製機制時,再使用loadbalance方式就會有問題了,因為如果有insert、update等寫操作改變了從機的數據就麻煩了,從機不會
將變化複製到主機,因此這種情況下需要實現“主讀寫、從只讀”的模式,為了達到這個目的可以使用replication方式,如下所示:
jdbc:mysql:replication://dbnode_1:port,dbnode_2:port,dbnode_3:port,dbnode_n:port/dbname?user=xxxx;password=xxxxxxxx;&characterEncoding=utf-8
replication方式可以很安全的實現寫操作只發送到主機執行,而從機只會接收到讀操作。