用 MySQL 自定义函数更新 Memory Cache
问题的提出
MySQL 读写同步有延时,在跨地域同步时,由于网络等原因甚至会超过1秒。
部署 Memory Cache 后,通常利用 Memory Cache 的方法是:
应用程序访问数据时先访问 Memory Cache,如果内存里没有数据就从 Slave 数据库读取,
同时写一份放到 Memory Cache
更新数据时,应用程序在更新 Master 数据库的同时,清掉 Memory Cache。
这个方案有个问题,在数据频繁更新、同步延时很大的时候比较突出。
问题在于应用程序清掉 Memory Cache 的速度很快,而 MySQL 同步的慢。
假设主库这边更新了数据并清了Memory Cache,而读库没同步完,就有人访问了数据。
读库这边的程序在内存里没找到数据,就从数据库里读,这时读出的是旧的数据,
然后又把旧的数据写到内存里了,下次怎么读都还是旧的。
更详细解释
http://www.dbanotes.net/arch/facebook_scaling_out.html
为解决这个问题,Facebook 对 MySQL SQL 语句解析的地方 进行了修改。
Memory Cache 里的数据在读库更新后更新,保证了数据的一致性
自定义的 SQL 语句,在 MySQL 执行 SQL 的同时更新Memory Cache
REPLACE INTO profile (`first_name`) VALUES ('Monkey') WHERE `user_id`='jsobel' MEMCACHE_DIRTY 'jsobel:first_name'
修改 MySQL SQL解析的方法比较麻烦,这里介绍一种更为简便的实现。
使用 MySQL 自定义函数 (User-Defined Function)
下载 memcached_functions_mysql ,编译安装
http://hg.tangent.org/memcached_functions_mysql/archive/tip.tar.gz
初始化自定义函数 SQL 语句
CREATE FUNCTION memc_set RETURNS INT SONAME "libmemcached_functions_mysql.so";
CREATE FUNCTION memc_servers_set RETURNS INT SONAME "libmemcached_functions_mysql.so";
...
更新Memory Cache的 SQL 语句
select memc_servers_set('localhost:11211');
select memc_set('zol', 'new value');
1374

被折叠的 条评论
为什么被折叠?



