I. Обзор
1. Что такое MongoDB? Обобщить одним предложением
MongoDB — это система управления базами данных, разработанная для веб-приложений и интернет-инфраструктуры. Да, MongoDB — это база данных, база данных типа NoSQL.
2. Зачем использовать MongoDB?
(1) MongoDB предлагает концепцию документов и коллекций и использует BSON (например, JSON) в качестве структуры своей модели данных.Его структура является объектно-ориентированной, а не двумерной таблицы.Таким образом, пользователь хранится в MongoDB.
{
username:'123',
password:'123'
}
Использование такой модели данных позволяет MongoDB обеспечивать высокие возможности чтения и записи в производственной среде, а пропускная способность значительно повышается по сравнению с базами данных SQL, такими как mysql.
(2) Простота масштабирования, автоматический переход на другой ресурс. Простая масштабируемость относится к предоставлению возможностей сегментирования, которые могут сегментировать набор данных и распределять давление хранения данных на несколько серверов. Автоматический переход на другой ресурс — это концепция набора реплик. MongoDB может определить, активен ли главный узел или нет. Когда он деактивируется, он может автоматически повышать подчиненный узел до главного узла для достижения отказа.
(3) Поскольку модель данных является объектно-ориентированной, она может представлять богатые и иерархические структуры данных.Например, в системе блогов «комментарии» могут быть непосредственно помещены в документы «статей» без необходимости создавать три подобных myqsl .таблица для описания такой связи.
3. Основные характеристики
(1) Тип данных документа Базы данных типа SQL нормализованы и могут обеспечивать целостность и уникальность данных с помощью ограничений первичного или внешнего ключа, поэтому базы данных типа SQL часто используются в системах с высокой степенью целостности данных. В этом аспекте MongoDB не так хороша, как база данных типа SQL, и MongoDB не имеет фиксированной схемы.Поскольку MongoDB имеет меньше таких ограничений, она может сделать структуру данных хранилища данных более гибкой и быстрой.
(2) Возможность мгновенного запроса MongoDB сохраняет возможность запрашивать реляционные базы данных в режиме реального времени и сохраняет возможность индексирования (нижний уровень основан на B-дереве). Это основано на преимуществах реляционных баз данных, которые не имеют вышеуказанных возможностей по сравнению с тем же типом Redis NoSQL.
(3) Возможность копирования Сама MongoDB предоставляет набор реплик, который может распределять данные по нескольким машинам для обеспечения избыточности, чтобы обеспечить автоматическое отключение при сбое и расширенные возможности чтения.
(4) Скорость и долговечность
Драйвер MongoDB реализует семантическую запись с огнем и забыванием, то есть когда драйвер вызывает запись, он может немедленно получить возврат и получить успешный результат (даже если он сообщает об ошибке), что, конечно же, увеличивает скорость записи. , будет какой-то незащищенный секс, полностью зависящий от сети.
MongoDB предоставляет концепцию журнала ведения журнала, который на самом деле похож на журнал бинарного журнала MySQL.Когда его нужно вставить, он сначала записывает записи в журнал, а затем выполняет фактическую операцию с данными, так что, если есть сбой питания, процесс внезапно прерывается.Это может гарантировать, что данные не будут неправильными, и может быть восстановлено путем чтения журнала ведения журнала с помощью функции восстановления.
(5) Расширение данных
MongoDB использует технологию сегментирования для расширения данных.MongoDB может автоматически сегментировать и автоматически передавать блоки данных в сегменты, так что данные, хранящиеся на каждом сервере, имеют одинаковый размер.
4. Сервисная модель C/S
Базовый сервер MongoDB в основном запускается через программу mongod, и нет необходимости настраивать память, используемую MongoDB при запуске, потому что философия его дизайна заключается в том, что управление памятью лучше оставить операционной системе, а отсутствие конфигурации памяти изюминкой дизайна MongoDB., вы также можете использовать функцию сегментирования через сервер маршрутизации mongos.
Основным клиентом MongoDB является интерактивная оболочка js, которую можно запустить через mongo.Используя оболочку js, вы можете использовать js для прямой связи с MongoDB и использовать синтаксис js для запроса данных MongoDB так же, как с помощью операторов sql для запроса данных mysql. Кроме того, предусмотрены различные языки.Пакет драйверов удобен для доступа к различным языкам.
5. Сложные инструменты командной строки
mongodump и mongorestore, стандартные инструменты для резервного копирования и восстановления баз данных. Вывод в формате BSON и перенос базы данных.
mongoexport и mongoimport используются для импорта и экспорта данных JSON, CSV и TSV, что полезно, когда данные должны поддерживать несколько форматов. mongoimport также можно использовать для первоначального импорта больших наборов данных, но перед импортом следует отметить, что для полноценного использования mongoDB обычно требуются некоторые корректировки модели данных.
mongosniff, инструмент сетевого сниффинга, используемый для наблюдения за операциями, отправляемыми в базу данных. По сути, он преобразует BSON, передаваемый по сети, в операторы оболочки, которые людям легко читать.
Таким образом, можно сделать вывод, что MongoDB сочетает в себе лучшие возможности хранилищ ключей и значений и реляционных баз данных. Из-за своей простоты данные обрабатываются чрезвычайно быстро, и относительно легко масштабировать базу данных, которая также предоставляет сложные механизмы запросов. MongoDB должен работать на 64-разрядном сервере, и лучше всего развертывать его отдельно, поскольку это база данных, она также должна обрабатываться как в горячем, так и в холодном резерве.
2. Войдите в оболочку MongoDB
Поскольку эта статья не является руководством по API, использование оболочки здесь также является базовым введением в то, какие функции можно использовать и какие операторы можно использовать, в основном для того, чтобы показать удобство использования оболочки MongoDB. специфический синтаксис оболочки MongoDB, вы можете обратиться к официальной документации.
1. Переключите базу данных
use dba
Создание базы данных не является обязательной операцией, базы данных и коллекции создаются только при первой вставке документа, что согласуется с динамической обработкой данных. Упрощает и ускоряет процесс разработки и облегчает динамическое выделение пространств имен. Строгий режим можно включить, если вы опасаетесь случайного создания базы данных или коллекции.
2. Вставьте синтаксис
db.users.insert({username:"smith"})
db.users.save({username:"smith"})
Отличие: если во вновь добавленных данных есть первичный ключ, функция insert() выдаст сообщение об ошибке, а функция save() изменит исходное содержимое на новое. Такие как:
Существующие данные: {_id : 1, " name " : " n1 " }, при повторной вставке insert({_id : 1, " name " : " n2 " }) сообщит о дублирующем сообщении об ошибке первичного ключа, save( { _id : 1, "имя": "n2" }) изменит n1 на n2.
Тот же момент: если во вновь добавленных данных нет первичного ключа, будет добавлена запись.
Существующие данные: { _id : 1, " name " : " n1 " }, при повторной вставке данные, вставленные с помощью insert({ " name " : " n2 " }) не имеют первичного ключа, поэтому часть данных будет добавлена , сохранить ({ " имя " : " n2 " }) Добавить часть данных.
3. Найдите грамматику
db.users.find()
db.users.count()
4. Обновить синтаксис
db.users.update({username:"smith"},{$set:{country:"Canada"}})
//把用户名为smith的用户的国家改成Canada
db.users.update({username:"smith"},{$unset:{country:1}})
//把用户名为smith的用户的国家字段给移除
db.users.update({username:"jones"},{$set:{favorites:{movies:["casablance","rocky"]}}})
//这里主要体现多值修改,在favorties字段中添加多个值
db.users.update({"favorites.movies":"casablance"},{$addToSet:{favorites.movies:"the maltese"}},false,true)
//多项更新
5. Удалите синтаксис
db.foo.remove() //删除所有数据
db.foo.remove({favorties.cities:"cheyene"}) //根据条件进行删除
db.drop() //删除整个集合
6. Синтаксис, связанный с индексом
db.numbers.ensureIndex({num:1})
//创建一个升序索引
db.numbers.getIndexes()
//获取全部索引
7. Базовый синтаксис управления
show dbs
//查询所有数据库
show collections
//显示所有表
db.stats()
//显示数据库状态信息
db.numbers.stats()
//显示集合表状态信息
db,shutdownServer()
//停止数据库
db.help()
//获取数据库操作命令
db.foo.help()
//获取表操作命令
tab 键 //能自动帮我们补全命令
Приведенные выше команды являются просто простыми примерами.Предположим, если вы раньше не изучали какой-либо синтаксис базы данных и начинаете изучать синтаксис запросов sql и синтаксис запросов MongoDB одновременно, какой из них вам будет проще? Если вы используете java-драйвер для работы с MongoDB, вы обнаружите, что любой запрос совпадает с методом запроса, предоставляемым Hibernate, пока вы создаете объект условия запроса, вы можете легко запросить (пример будет приведен ниже), blogger Я был знаком с ES6 раньше, так что начать работу с MongoDB js shell не проблема, именно из-за этого простого и совершенного механизма запросов я глубоко влюбился в MongoDB.
3. Используйте java-драйвер
Использование java-драйвера для связывания MongoDB — это очень простое дело, простая ссылка, простое добавление, удаление, модификация и запрос. После использования java-драйвера я обнаружил, что Spring-инкапсуляция MongoDB не так проста в использовании, как официальные.Ниже приведена простая демонстрация использования.
1. Используйте maven для импорта пакета jar
<dependency>
<groupId>org.mongodbgroupId>
<artifactId>mongodb-driver-syncartifactId>
<version>3.8.0-beta3version>
dependency>
2. Создайте клиент доступа
MongoClient client = MongoClients.create(“mongodb://10.201.76.94:27017”);
3. Получите количество наборов
public long count() {
MongoClient client = this.getClient();
MongoCollection collections= client.getDatabase("mongodb_db_name").getCollection("mongodb_collection_name");
return collections.count();
}
4. Сбор запросов
public List find(Document params,Bson sort,int skip,int limit) {
MongoClient client = this.getClient();
MongoCollection collections= client.getDatabase("mongodb_db_name").getCollection("mongodb_collection_name");
List list = new ArrayList(Integer.valueOf(config.getPro("sync_limit")));
collections.find(params).sort(sort).skip(skip).limit(limit).forEach(new Block() {
@Override
public void apply(Document document) {
list.add(document);
}
});
return list;
}
Здесь показаны только простая ссылка и простая операция MongoDB, что показывает простоту операции. При использовании драйвера он взаимодействует с MongoDB на основе сокетов TCP.Если слишком много результатов запроса, которые не могут быть помещены на первый сервер, на сервер будет отправлена команда getmore для получения следующего пакета результатов запроса.
При вставке данных на сервер он не будет ждать ответа сервера.Драйвер будет считать, что запись прошла успешно, и фактически использует клиент для генерации идентификатора объекта, но это поведение можно настроить в конфигурации и включить через безопасный режим, что можно проверить.Ошибка вставки на стороне сервера.
Четыре, принципы проектирования схемы
1. Нужно обратить внимание на характеристики самой MongoDB
Иметь четкое представление об основном блоке данных MongoDB. В реляционной базе данных есть таблицы данных со столбцами и строками. Базовой единицей данных MongoDB является документ BSON. В значении ключа есть ключ, указывающий на значение неопределенного типа. MongoDB имеет мгновенный запрос, но не поддерживает операции соединения. Простое хранилище значений ключа может только получить значений, основанных на одном ключе, и не поддерживает транзакции, но поддерживает несколько атомарных операций обновления.
2. Необходимо обратить внимание на характеристики чтения и записи самой системы.
Например, каково соотношение чтения и записи, какой тип запроса требуется, как обновляются данные, будут ли возникать проблемы с параллелизмом и будет ли степень структуры данных высокой или низкой. Потребности самой системы определяют mysql или MongoDB.
3. Обратите внимание на режим проектирования схемы MongoDB.
Встраивание и ссылки: когда дочерний объект всегда появляется в контексте родительского объекта, используйте вложенный документ; в противном случае сохраните дочерний объект в отдельной коллекции.
一对多的关系
: добавить идентификатор к идентификатору зависимости в отношении набора «многие».
多对多
: Используйте массив объектов в одном из соответствий, чтобы указать на другой объект.
树
: конкретизированный путь, каждый узел в дереве содержит поле пути, которое специально сохраняет идентификатор предка каждого узла.
动态属性
: индексы могут быть добавлены для различных динамических атрибутов.Если вам нужно обвести атрибуты в диапазоне, вы можете использовать метод «ключ-значение», а затем добавить индекс к единому ключу.
关于事务
: Если вам нужна поддержка транзакций, вы можете только выбрать другую базу данных или предоставить компенсационные транзакции для решения проблемы транзакций.
Есть несколько принципов, на которые следует обратить внимание при разработке схемы, например:
-
Нельзя создавать бесполезные индексы
-
Нельзя хранить разные типы в одном поле
-
Невозможно поместить несколько типов сущностей в коллекцию. Невозможно создавать громоздкие, глубоко вложенные документы.
-
Не создавайте слишком много коллекций, пространства имен коллекций, индексов и баз данных ограничены.
-
Невозможно создать коллекцию, которую нельзя сегментировать
4. Обратите внимание на некоторые особенности MongoDB.
(1) Сосредоточьтесь на концепции базы данных
База данных — это логическая и физическая группа коллекций. MongoDB не предоставляет синтаксиса для создания базы данных. База данных создается только при вставке коллекции. После создания БД на диске размещается набор файлов данных, в которых хранятся все коллекции, индексы и другие метаданные БД, может быть пройдена проверка состояния использования диска БД.
db.stats()
(2) Обратите внимание на концепцию сбора
Коллекция является контейнером для структурно или концептуально подобных документов, имя коллекции может содержать цифры, буквы или символы ., но должно начинаться точно с буквы или цифры.
Квалифицированные имена коллекций не могут превышать 128 символов, фактически символ . используется в коллекциях для предоставления своего рода виртуального пространства имен, что является организационным принципом, который обрабатывается так же, как и другие коллекции. Имеется в коллекциях.
system.namespaces //查询当前数据库中定义的所有命名空间
system.indexes //存储当前数据库的所有索引定义
(3) Следуйте документу
Второе — значение ключа, все строки в MongoDB имеют тип UTF-8. Числовые типы включают double, int и long. Все типы дат представлены в формате UTC, поэтому время в MongoDB будет на 8 часов медленнее, чем время в Пекине. Размер всего документа будет ограничен 16 м, поскольку это предотвращает создание некрасивых типов данных, а небольшие документы могут повысить производительность.Идеальный диапазон номеров для документов с пакетной вставкой – 10–200, а размер не может превышать 16 МБ.
Пять, оптимизация индексов и запросов
1. Практические правила индексации
(1) Индекс может значительно снизить рабочую нагрузку, необходимую для получения документов, а конкретное сравнение можно сравнить с помощью метода .explain().
(2) При разборе запроса MongoDB выбирает индекс для запроса по оптимальному плану.Если нет наиболее подходящего индекса, он сначала использует каждый индекс для запроса и, наконец, выбирает оптимальный индекс для запроса.
(3) Если есть составной индекс a-b, то индекс только для a является избыточным
(4) Порядок ключей в составном индексе очень важен
2. Тип индекса
(1) Индекс с одним ключом (2) Составной индекс (3) Уникальный индекс (4) Разреженный индекс Например, индексированное поле будет иметь нулевое значение или большое количество документов не содержат индексированного ключа.
3. Проблемы построения индекса
Если набор данных большой, построение индекса займет много времени, что повлияет на производительность программы.
db.currentOp() //查看索引的构建时间
Индексы перестраиваются при использовании mongorestore. Когда было выполнено крупномасштабное удаление, используйте
db.values.reIndex()
Сжать и перестроить индекс.
4. Определите медленные запросы
(1) Проверьте журнал медленных запросов
grep -E '([0-9])+ms' mongod.log //使用grep 命令 识别命令信息
db.setProfillingLevel(2) //使用解刨器,将记录每次的读写到日志
db.setProfillingLevel(1) //只记录慢(100ms)操作
(2) Анализ медленных запросов
db.values.find({}).sort({close:-1}).limit(1).explain()
scanOrder 字段表明没有使用索引
Курсор использует BasicCursor при отсутствии индекса и BtreeCursor при использовании индекса
n представляет возвращаемый набор результатов
nscanned указывает количество документов для прохождения indexBounds указывает границу индекса
Обратите внимание, что метод объяснения новой версии MongoDB требует параметров, иначе будет отображаться только обычная информация.
6. Набор реплик MongoDB
В этом разделе также кратко представлены простота создания набора реплик MongoDB, надежность набора реплик и простота мониторинга.
1. Зачем использовать наборы реплик
Обеспечьте возможность репликации ведущий-ведомый, возможность горячего резервирования, возможность аварийного переключения
2. Метод строительства
rs.initiate()
rs.add("localhost:40001")
rs.add("localhost:40002",{arbiterOnly:true})
3. Мониторинг
db.isMasrter()
rs.status()
4. Как работают наборы реплик
Фактически, работа MongoDB с наборами реплик аналогична операции mysql master-slave.Давайте сначала посмотрим на процесс потока данных master-slave в mysql.
Главный binlog -> подчиненный relay.log -> подчиненный bin.log -> подчиненная база данных Файл журнала, на который в основном полагается MongoDB, называется oplog.
ведущий оплог -> подчиненный оплог Операции записи сначала записываются и добавляются в oplog основного узла. В то же время все подчиненные узлы реплицируют oplog. Во-первых, проверьте метку времени последней записи в вашем оплоге; во-вторых, запросите все записи в оплоге главного узла, которые больше этой временной метки; наконец, добавьте эти записи в свой оплог и примените его к своей собственной библиотеке. Подчиненные устройства используют длительный опрос для немедленного применения новых записей из главного оплога.
При возникновении следующих условий подчиненный узел прекратит репликацию.
-
Если ведомое устройство не может найти точку синхронизации в оплоге ведущего, оно навсегда остановит репликацию.
-
Как только подчиненный узел не может найти точку в оплоге главного узла, с которой он был синхронизирован, он больше не может гарантировать идеальную копию подчиненного узла.
Локальная база данных содержит все данные элементов набора реплик и журналы oplog.
-
replset.minvalid содержит информацию о начальной синхронизации для указанного члена набора реплик.
-
system.replset хранится в документе конфигурации набора реплик.
-
System.Indexes Стандартный индекс Описание Контейнер
-
мои рабы в основном используются для написания проблем
Вы можете просмотреть репликацию с помощью следующей команды
db.oplog.rs.findOne()
-
ts содержит временную метку BSON записи
-
т это описание с эпохи
-
я счетчик
-
op представляет код операции
-
ns идентифицирует соответствующее пространство имен
5. Обнаружение сердцебиения
Каждый элемент набора реплик каждую секунду проверяет связь со всеми остальными элементами, и вы можете увидеть отметку времени последнего обнаружения пульса и состояние работоспособности узла с помощью rs.status().
6. Отказоустойчивость
Этот момент не нужно описывать слишком подробно, но есть особый сценарий: если и подчиненный узел, и узел-арбитр будут убиты, а останется только главный узел, он понизит себя и станет подчиненным узлом.
7. Фиксация и откат
Если данные главного узла не были записаны в подчиненную базу данных, данные не могут считаться отправленными.Когда главный узел становится подчиненным узлом, будет запущен откат, и те данные, которые не были записаны в базу данных база данных slave будет удалена.Файлы BSON в подкаталогах восстанавливают содержимое отката.
8. Диск и копирование
(1) Используйте ссылку с одним узлом
Он может быть связан только с главным узлом.Если он связан с подчиненным узлом, операция записи будет отклонена, но если безопасный режим не используется, из-за функции «огонь и забудь» монго, исключение записи отказ будет съеден.
(2) Связывание с использованием набора реплик
Он может автоматически переключаться в соответствии с ситуацией записи, но когда набор реплик проводит новые выборы, все равно произойдет сбой.Если безопасный режим не используется, все равно будет ситуация, когда запись не может быть введена, но реальность удалась.
(3) Напишите о проблеме
Вы можете использовать контроль записи, чтобы обратить внимание на то, были ли данные записаны в библиотеку MongoDB.Использование контроля записи потребляет производительность и требует компромисса между скоростью и надежностью.
7. Фрагментация
Шардинг — это концептуальная реализация сегментирования базы данных.Вот краткое изложение того, почему используется сегментирование, а также принципы и операции сегментирования.
1. Зачем нужен шардинг?
Когда объем данных слишком велик, все больше и больше памяти занимают индексы и рабочие наборы данных, поэтому необходимо решить эту проблему за счет шардирования нагрузки.
2. Как работает шардинг
(1) Компоненты разделения
Осколки: каждый осколок представляет собой набор реплик
Маршрутизатор mongos: это маршрутизатор, который направляет запросы на чтение и запись в соответствующий сегмент.
Конфигурация сервера конфигурации: постоянные метаданные для сегментированных кластеров, в том числе глобальная конфигурация кластера, расположение данных для каждой базы данных, коллекции и определенного диапазона, запись об изменении, которая сохраняет историческую информацию о миграции данных между сегментами. Серверы конфигурации не существуют в виде наборов реплик.Когда mongos отправляет информацию на сервер конфигурации, она отправляется в два этапа, чтобы обеспечить согласованность между серверами конфигурации.
(2) Основные операции шардинга
Разделение коллекции: разделение основано на ряде атрибутов, и MongoDB использует так называемые ключи сегментов, чтобы позволить каждому документу найти свое место в этих диапазонах.
Блок: это непрерывный диапазон ключей осколков, расположенных в осколке.Можно понять, что несколько блоков образуют осколки, а осколки формируют все данные MongoDB.
(3) Разделение и миграция
Разделение блоков: при инициализации существует только один блок, а максимальный размер блока 64 МБ или 100 000 документов вызовет разделение блоков. Разделите исходный диапазон пополам, чтобы у вас было два фрагмента с одинаковым количеством документов в каждом.
Миграция: когда размер данных в сегментах различается, происходит действие миграции. Например, если в сегменте A больше данных, некоторые блоки из сегмента A будут перенесены в сегмент B. Сегментированный кластер достигает балансировки путем перемещения блоков между сегментами и управляется программным процессом, называемым балансировщиком, задачей которого является обеспечение того, чтобы данные оставались равномерно распределенными между сегментами, когда сегмент с наибольшим количеством блоков в кластере имеет Когда разница между блоками наименьший фрагмент больше 8, эквалайзер инициирует процесс выравнивания.
3. Осколочный бой
Запустите два набора реплик, три сервера конфигурации и один процесс mongos.
Настроить шардинг
sh.help() //查看分片相关帮助
sh.addShard() //添加分片
db,getSiblingDB("config").shards.find() //查看分片列表
sh.status() //分片详情
sh.enableSharding("cloud-docs") //开启一个数据库上的分片
db.getSiblingDB("config").databases,find() //查看数据库列表
sh.shardCollection("cloud-docs.spreadsheets",{username:1,_id:1}) //使用一个分片键定义一个分片集合spreadsheets,根据用户名进行切分
sh.getSiiblingDB("config").collections.findOne() //查看集合列表
db.chunks.count() //查看块的个数
db.chunks.findOne() //查看块的信息
db.changelog.count(}what:"split"|) //查看块切分日志
db.changelog.find({what:"moveChunk.commit"}).count() //查看日志迁移记录
4. Разделенный запрос и индекс
(1) Тип запроса фрагмента
Целевой запрос: запрос содержит ключ сегмента
Глобальный запрос или запрос на разброс/сбор: запрос не содержит ключа сегмента
Процесс запроса: запрос направляется в указанный сегмент с помощью ключа сегмента.Оказавшись на сегменте, сегмент решает, какой индекс использовать для выполнения запроса.
(2) Указатель
Каждый сегмент поддерживает свой собственный индекс. Когда индекс объявлен для сегментированной коллекции, каждый сегмент создает независимый индекс для своей части коллекции. Сегментированная коллекция в каждом сегменте должна иметь одинаковый индекс .
Разделенные коллекции позволяют добавлять уникальные индексы только в поле _id и ключ сегмента, но не где-либо еще, так как это требует связи между сегментами, что сложно реализовать.
При создании сегмента создается индекс на основе ключа сегмента.
5. Выберите ключ осколка
(1) Ключ сегмента нельзя изменить, и выбор ключа сегмента очень важен. (2) Неэффективный ключ сегмента
Плохое распределение: если используется идентификатор объекта BSON, все вновь вставленные документы будут попадать в небольшой непрерывный диапазон, который нельзя вставлять разрозненно.
Отсутствие локальности: восходящие ключи осколков имеют четкое направление, совершенно случайные ключи осколков вообще не имеют направления. Первые нельзя разбрасывать и вставлять, а вторые можно вставлять разрозненно, например, используя MD5 в качестве ключа осколка.
(3) Идеальный ключ осколка
Равномерно распределяйте вставляемые данные по осколкам
Убедитесь, что операции CRUD могут использовать преимущества локальности и иметь достаточную степень детализации для разделения блоков.
Ключ сегмента, отвечающий этим требованиям, обычно состоит из двух полей: первое — крупнозернистое, а второе — более мелкозернистое.
6. Шардинг в производстве
(1) Топология развертывания
-
Репликация mongod: требуется отдельный сервер развертывания
-
Сервер конфигурации: серверу конфигурации не обязательно иметь собственный компьютер.
По разным дата-центрам
(2) Минимальные требования
-
Каждый элемент набора реплик, независимо от того, является ли он полным узлом набора реплик или узлом-арбитром, должен быть размещен на другом компьютере.Каждый элемент набора реплик, используемый для репликации, должен иметь свой собственный компьютер.
-
Узел арбитража набора реплик очень легкий и может совместно использовать машину с другими процессами.
-
Сервер конфигурации также может выбрать совместное использование компьютера с другими процессами.
(3) Примечания по конфигурации
Чтобы оценить размер кластера, используйте следующую команду для сегментирования существующей коллекции.
sh.splitAt("cloud-docs.spreadsheets",{"username":"chen","_id":ObjectId("")})
//手动拆分块
sh.moveChunk("cloud-docs.spreadsheets",{username:"chen"},"shardB")
//手动将某分块移至分片B
db.runCommand({removeshard:"shard-1/arete:30100,arete:30101"})
//删除分片
db.runCommand({moveprimary:"test",to:"shard-0-test-rs"});
//移动主分片
(4) Резервное копирование сегментированных кластеров
Балансировщик должен быть остановлен при резервном копировании осколков
db.settings.update({_id:"ba;ancer"},{$set:{stopped:true},true});
sh.setBalancerState(false);
//停止均衡器,此时均衡器将进行最后一轮均衡
db.locks.find({_id:"balancer"});
sh.isBalancerRunning();
//查看均衡器状态,任何状态大于0 的状态值都说明均衡器仍在进行中
8. Развертывание и управление
1. Развертывание
(1) Архитектура развертывания
Использование 64-битных машин и 32-битных машин ограничит память mongodb максимум до 1,5 ГБ.
(2) ЦП
mongodb столкнется с узкими местами ЦП только тогда, когда индексы и рабочие наборы могут быть помещены в память. Роль ЦП в использовании mongodb заключается в извлечении данных. Если вы видите насыщение ЦП, вы можете запросить журнал медленных запросов. Проверьте, вызван ли запрос по проблеме, если она есть, можно решить проблему, добавив индекс mongodb использует процессор при записи данных, но mongodb использует только одно ядро за раз для записи данных.Если запись происходит часто, эту проблему можно решить с помощью сегментирования.
(3) Память
Большой объем памяти является гарантией mongodb.Если размер рабочего набора превышает объем памяти, это приведет к снижению производительности, поскольку это увеличит действие по загрузке данных в память.
(4) Жесткий диск
По умолчанию mongodb будет принудительно синхронизироваться с диском каждые 60 секунд, что называется фоновым обновлением, которое будет генерировать операции ввода-вывода. При перезапуске mongodb данные с диска будут загружены в память, а скоростной диск сократит время синхронизации
(5) Файловая система
Использование файловых систем ext4 и xfs
Отключить время последнего доступа
vim /etc/fstab
(6) Дескриптор файла
Дескриптор файла по умолчанию для Linux — 1024, который необходимо увеличить на большую величину.
(7) Часы
Используйте сервер ntp между каждым сервером узла mongodb
2. Безопасность
(1) Привязать IP
Используйте команду --bind_ip при запуске
(2) Аутентификация
Используйте команду --auth при запуске
db.addUser("","",true)
//创建用户,最后一个参数指定是否只读
(3) Идентификация набора реплик
Используйте keyFile, обратите внимание, что разрешение файла keyFile должно быть 600, иначе не запустится
3. Импорт и экспорт данных
mongoimport
mongoexport
4. Конфигурация сервера
(1) Топологическая структура
Для создания набора реплик требуется как минимум два узла, а узлу-арбитру не обязательно иметь собственный сервер.
(2) Журнал регистрации
При записи данных журнал будет записываться первым, а данные в это время не записываются напрямую на жесткий диск, а записываются в память Но журналы журналов будут потреблять память, поэтому их можно закрыть в основной библиотеке и запустить в подчиненной библиотеке. Твердотельный накопитель можно использовать отдельно для журналов ведения журнала.
При вставке драйвер может обеспечить вставку журналирования, а затем обратной связи, но это сильно повлияет на производительность.
5. Журнал
logpath 选项指定日志存储地址
-vvvvv 选项(v越多,输出越详细)
db.runCommand({logrotare:1}) 开启滚动日志
6. Команды мониторинга базы данных
(1) состояние сервера
-
globalLock представляет общее время, которое сервер тратит на блокировку записи.
-
mem показывает, как используется память
-
биты указывает битовую длину этой машины
-
резидент указывает количество занимаемой физической памяти
-
virtual представляет используемую виртуальную память
(2) верх
(3) db.currentOp()
7.mongostat
Динамически отображать данные об активности mongodb
8. веб-консоль
Занять порт 1000 над текущим портом прослушивания mongodb
9. Резервное копирование и восстановление
(1) монгодамп
Экспорт содержимого базы данных в файлы BSON, и mongorestore может читать и восстанавливать эти файлы.
(2) монгорестор
Восстановите экспортированный файл BSON в базу данных.
(3) Резервное копирование исходных файлов данных
Это можно сделать, однако перед операцией требуется обработка библиотеки блокировок db.runCommand({fsync:1,lock:true})
db.$cmd.sys.unlock.findOne() запрашивает операцию разблокировки, но база данных не будет разблокирована немедленно, и ее необходимо проверить с помощью db.currentOp().
10. Сжатие и ремонт
(1) Ремонт
mongd --repair восстановить все базы данных db.runCommand({repairDatabase:1}) Восстановить одну базу данных Исправление состоит в том, чтобы прочитать и перезаписать все файлы данных в соответствии с файлом Jourling и перестроить отдельные индексы.
(2) Сжатие
db.spreadsheets.reIndex() // Перестроить индекс db.runCommand({компактный:"электронные таблицы"}) Сжатие перезапишет файлы данных и перестроит все индексы коллекции. Его необходимо остановить или запустить в подчиненной библиотеке. Если необходимо запустить в основной библиотеке, необходимо добавить параметр force, чтобы обеспечить блокировку записи.
11. Настройка производительности
(1) Мониторинг состояния диска
йостат (2) Проверяйте индексы и запросы для повышения производительности.
В общем, сканируйте как можно меньше документов.
Убедитесь, что нет избыточных индексов, избыточные индексы будут занимать место на диске, потреблять больше памяти и должны выполнять больше работы при каждой записи.
(3) Добавить память
db.stats() //Просмотр состояния размера занятости данных базы данных Если сумма размера данных dataSize и размера индекса indexSize больше памяти, это повлияет на производительность.
Если storageSize превышает dataSize более чем в два раза по сравнению с размером данных, это повлияет на производительность из-за фрагментации диска и потребуется сжатие.