上一篇《Elasticsearch与 MongoDB 数据同步及分布式集群搭建 (一)》我们已经配置了一个 Elasticsearch与 MongoDB 数据同步高可用,可扩展以及分布式是 ES 的一个优势和特色,扩展垂直扩展或者向上扩展,Vertical Scale/Scaling Up,或是水平扩展或者向外扩展,Horizontal Scale/Scaling Out。 一个节点会运行一个 ES 的实例,一个集群则会包含拥有相同cluster.name的一个或者 多个节点,这些节点共同工作来完成数据共享和负载分担。随着节点被添加到集群,或者从集群中被删除,集群会通过自身调节来将数据均匀分布。集群中的一个节 点会被选为主节点(Master Node),它负责管理整个集群的变化,如创建或者删除一个索引(Index),向集群中添加或者删除节点。任何节点都可以成为主节点。在我们的例子中只 有一个节点,所以它就承担了主节点的功能。ES 通过分片将数据分布在集群中。可以将分片想象成数据的容器。文档会被存储在分片中,而分片则会被分配到集群 中的节点中。随着集群的扩大和虽小,ES 会自动地将分片在节点之间进行迁移,以保证集群能够保持一种平衡。一个分片可以是主分片(Primary Shard)或者副本分片(Replica Shard)。索引中的每份文档都属于一个主分片,所以主分片的数量就决定了你的索引能够存储的最大数据量。一个副本分片则只是一个主分片的拷贝。副本用 来提供数据冗余,用来保护数据在发生硬件故障是不会丢失,同时也能够处理像搜索和获取文档这样的读请求。主分片的数量在索引建立之初就会被确定下来,而副 本分片的数量则可以在任何时候被更改。 具体原理可以参考官方文档:《life inside a cluster》 演示水平扩展,这里新添加一个 ES 实例的虚拟机,这样我们之前的 ES 实例为:10.253.1.70,现在添加一个新的节点:10.253.1.71.,需要保证这两个节点之间是可以互相通信的. 配置 config/elasticsearch.yml 10.253.1.70 相关配置为: cluster.name: elasticsearch_ryan node.name: "cluster-node-1" </pre> 10.253.1.71相关配置为: <pre class="brush: bash; title: ; notranslate" title="">cluster.name: elasticsearch_ryan node.name: "cluster-node-1" 其实就是要保证有共同的cluster.name 启动 10.253.1.71 的 ES 服务,然后可以查看下节点集群的状态: curl -XPOST "http://10.253.1.70:9200/_cluster/health" { "cluster_name": "elasticsearch_ryan", "status": "green", "timed_out": false, "number_of_nodes": 2, "number_of_data_nodes": 2, "active_primary_shards": 9, "active_shards": 18, "relocating_shards": 0, "initializing_shards": 0, "unassigned_shards": 0 } 可以看到现在有 2 个节点,status 表集群的状态,具体状态含义:

阅读全文

Elasticsearch通过 River 可以与多种数据源 Wikipedia, MongoDB, CouchDB, RabbitMQ, RSS, Sofa, JDBC, FileSystem,Dropbox 等同步,公司的业务是用 MongoDB,今天测试环境虚拟机上配置了一下 Elasticsearch 与 MongoDB 的同步,作个大概的过程记录,主要利用richardwilly98 / elasticsearch-river-mongodb。 River 通过读取 mongodb 的 oplog 来同步数据,oplog 这个表来使集群中的不同机器数据同步的,可以保证 es 里面的数据和 mongodb 里面的是一样的,所以 Mongdb 必须是个集群才能拥有 oplog.注意:该插件只支持集群环境下的 mongodb,因为集群环境下的 mongodb 才有 oplog 这个 Elasticsearch 和 MongoDB 需要安装对应的版本才能实现同步,我这里用了最新的 Elasticsearch 1.4.2 和 MongoDB 3.0.0,相应的版本要求参考下表 MongDB 是一个副本集的集群,具体副本集集群的搭建不详细写了,Elasticsearch 的安装配置也省略。 1.安装 elasticsearch-river-mongodb # ./elasticsearch-1.4.4/bin/plugin -install elasticsearch/elasticsearch-mapper-attachments/2.4.1 # ./elasticsearch-1.4.4/bin/plugin -i com.github.richardwilly98.elasticsearch/elasticsearch-river-mongodb/2.0.5 2.建立 river curl -XPUT "http://10.253.1.70:9200/_river/threads_mongo_river/_meta"&lt;/span&gt; -d' { "type": "mongodb", "mongodb": { "servers": [ { "host": "10.

阅读全文

公司的客服系统是用 Yii 开发的,权限系统是基于 Yii CDbAuthManager 开发的,随着权限项目的增加和权限组以及人员的增多,导致加入页面的时候打开很慢,因为没进入一个页面会去检查一下该用户对于该操作的权限。下面是用XHProf查看的结果部分截图,会发现CDbAuthManager::checkAccess 和CDbAuthManager::checkAccessRecursive 等CDbAuthManager 方法会调用很多次,而 CDbAuthManage 是基于数据库,所以每次调用还要去进行数据库的查询,这样难免会给性能带来瓶颈。(该图只要关注第一和第二列就可以了,其他列是优化过的结果且本机的测试数据库)。 利用 Redis 加速 Yii CDbAuthManager 再来看下CDbAuthManager::checkAccessRecursive这个方法的实现,这个方法会去递归的查询数据库来验证用户的授权项目。 protected function checkAccessRecursive($itemName, $userId, $params, $assignments) { if (($item = $this->getAuthItem($itemName)) === null) return false; Yii::trace('Checking permission "' . $item->getName() . '"', 'system.web.auth.CDbAuthManager'); if ($this->executeBizRule($item->getBizRule(), $params, $item->getData())) { if (in_array($itemName, $this->defaultRoles)) return true; if (isset($assignments[$itemName])) { $assignment = $assignments[$itemName]; if ($this->executeBizRule($assignment->getBizRule(), $params, $assignment->getData())) return true; } $parents = $this->db->createCommand() ->select('parent') ->from($this->itemChildTable) ->where('child=:name', array(':name' => $itemName)) ->queryColumn(); foreach ($parents as $parent) { if ($this->checkAccessRecursive($parent, $userId, $params, $assignments)) return true; } } return false; } CDbAuthManager的其他对授权项目的操作都是基于数据库的读写,具体源码实现:http://code.

阅读全文

redis 批量删除 KEY

$redis-cli KEYS 'message_new:*' | xargs redis-cli DEL 搞定! 转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记 如果觉得本篇文章对您十分有益,何不 打赏一下 本文链接地址: redis 批量删除 KEY 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

阅读全文

Redis 主从复制配置

Redis 的 master 可以拥有多个 slave,多个 slave 可以连接同一个 master 外,还可以连接到其他 slave,主从复制在同步数据时,master 可以继续处理 client 请求不会阻塞 master,。 大体机制是这样:slave 与 master 建立连接,然后发送 sync 命令。无论是第一次连接还是重新连接,master 都会启动一个后台进程,将数据库快照保存到文件中,同时 master 主进程会开始收集新的写命令并缓存。后台进程完成写文件后,master 就发送文件给 slave,slave 将文件保存到硬盘上,再加载到内存中,接着 master 就会把缓存的命令转发给 slave,后续 master 将收到的写命令发送给 slave。如果 master 同时收到多个 slave 发来的同步连接命令,master 只会启动一个进程来写数据库镜像,然后发送给所有的 slave。 具体配置比较简单,在 slave 的配置文件中:slaveof master_IP Port slaveof 192.168.1.123 6397 具体配置比较简单,在 slave 的配置文件中:slaveof master_IP Port slaveof 192.168.1.123 6397 启动 master 和 salve 的 redis 服务以后,查看一下 salve 的 info 末尾会看到, 具体配置比较简单,在 slave 的配置文件中:slaveof master_IP Port slaveof 192.

阅读全文

redis 是一个高性能的 key-value 数据库。 redis 的出现,很大程度补偿了 memcached 这类 keyvalue 存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了 Python,Ruby,Erlang,PHP 客户端,使用很方便。目前国内新浪微博等一些都在用。 记录一下我的 redis 安装和配置过程,主要是 redis 在 linux 下的安装配置,phpredis 的安装,以及 Netbeans 中配置 phpredis 的代码自动完成。 下载最新的稳定版本 redis,解压编译安装: wget http://redis.googlecode.com/files/redis-2.4.17.tar.gz tar zxvf redis-2.4.17.tar.gz cd redis-2.4.17/ make sudo make install 编译好的文件将被复制到了/usr/local/bin 下 mkdir -p /usr/local/bin cp -pf redis-server /usr/local/bin cp -pf redis-benchmark /usr/local/bin cp -pf redis-cli /usr/local/bin cp -pf redis-check-dump /usr/local/bin cp -pf redis-check-aof /usr/local/bin 将配置文件复制到 /etc 下面 sudo cp /usr/local/redis/redis.

阅读全文

PHP 对 mongoDB的update操作

$inc 如果记录的该节点存在,让该节点的数值加 N;如果该节点不存在,让该节点值等于 N 设结构记录结构为 array(’a’=>1,’b’=>’t’),想让 a 加 5,那么: $coll->update( array(’b'=>’t'), array(’$inc’=>array(’a'=>5)), ) $set 让某节点等于给定值 设结构记录结构为 array(’a’=>1,’b’=>’t’),b 为加 f,那么: $coll->update( array(’a'=>1), array(’$set’=>array(’b'=>’f')), ) $unset 删除某节点 设记录结构为 array(’a’=>1,’b’=>’t’),想删除 b 节点,那么: $coll->update( array(’a'=>1), array(’$unset’=>’b'), ) $push 如果对应节点是个数组,就附加一个新的值上去;不存在,就创建这个数组,并附加一个值在这个数组上;如果该节点不是数组,返回错误。 设记录结构为 array(’a’=>array(0=>’haha’),’b’=>1),想附加新数据到节点 a,那么: $coll->update( array(’b'=>1), array(’$push’=>array(’a'=>’wow’)), ) 这样,该记录就会成为:array(’a’=>array(0=>’haha’,1=>’wow’),’b’=>1) $pushAll 与$push 类似,只是会一次附加多个数值到某节点 $addToSet 如果该阶段的数组中没有某值,就添加之 设记录结构为 array(’a’=>array(0=>’haha’),’b’=>1),如果想附加新的数据到该节点 a,那么: $coll->update( array(’b'=>1), array(’$addToSet’=>array(’a'=>’wow’)), ) 如果在 a 节点中已经有了 wow,那么就不会再添加新的,如果没有,就会为该节点添加新的 item——wow。 $pop 设该记录为 array(’a’=>array(0=>’haha’,1=>’wow’),’b’=>1) 删除某数组节点的最后一个元素: $coll->update( array(’b'=>1), array(’$pop=>array(’a'=>1)), ) 删除某数组阶段的第一个元素

阅读全文

PHP 操作 mongoDB 之添删改查

与 mongoDB 建立连接: 直接实例化 mongo 类+创建连接: $mo = new Mongo();//得到一个Mongo连接对象 实例化了一个 Mongo 类,并且与默认的 localhost:27017 端口的 mongoDB 建立连接。 如果想连接到其他的主机,可以这样写: $mongo = new Mongo("mongodb://username:password@192.168.1.22:12345"); 另外一种方式,实例化 mongo 类,再手动建立连接: $mongo = new Mongo("mongodb://username:password@192.168.1.22:12345",array('connect'=&gt;false));//初始化类 $mongo-&gt;connect();//创建连接 Mongo 类中有用的一些方法: Mongo::listDBs() 返回一个包含当前 mongo 服务上的库(DB)信息的数组。 $dbs = $mo->listDBs();//获得一个包含db信息的数组 Mongo::selectCollection($db,$coll) 返回一个当前连接下的某 db 中的 collection 对象。 $mo = new Mongo(); $coll = $mo->selectCollection(’db’,'mycoll’);//得到一个collection对象 选择想要的数据库(Mongo 类): 一种方式: $mongo = new Mongo(); $db = $mongo-&gt;foo;//得到一个MongoDB对象 另一种方式: $mongo = new Mongo(); $db = $mongo-&gt;selectDB(’foo’);//得到一个MongoDB对象 MongoDB 中有用的函数:

阅读全文

作者的图片

Ryan是菜鸟 | LNMP技术栈笔记

一步一个脚印,一直在路上!记录LNMP技术栈,Web架构,区块链等笔记

菜鸟码农

南京